Как писать читаемые строки в Scala - PullRequest
2 голосов
/ 08 марта 2011

В scala, когда вы записываете строку «Hello World» в файл, он записывает

Hello World

(примечание: без двойных кавычек).

В Лиспе есть концепция печати и записи. Один пишет без двойных кавычек, другой включает их, чтобы упростить запись структур данных и их последующее чтение с помощью стандартного считывателя.

Есть ли способ сделать это в Scala?

С одной строкой ее достаточно легко отформатировать, но со многими глубоко вложенными структурами это практически невозможно.

Например, скажем, у меня есть

sealed trait PathSegment
case class P(x:String) extends PathSegment
case class V(x:Int)    extends PathSegment

Для создания нужно:

P("X")

или

V(0)

список этих PathSegments печатается как:

List(P(paths), P(/pets), P(get), P(responses), V(200))

Я хочу распечатать это как:

List(P("paths"), P("/pets"), P("get"), P("responses"), V(200))

Другими словами, я хочу, чтобы строки (и символы), независимо от того, где они находились в структуре, выводились как "foo" или 'c'

Ответы [ 3 ]

1 голос
/ 08 марта 2011

Проверьте lift-json (https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/) для записи данных, которые будут проанализированы и прочитаны на другом языке. JSON является довольно стандартным в мире веб-сервисов для сериализации запросов / ответов, и библиотеки JSON есть практически на каждом языке.

Чтобы буквально записать строку, включающую двойные кавычки, вы также можете сделать что-то вроде этого:

"""
The word "apple" is in double quotes.
"""

Я считаю немного более структурированный формат, такой как JSON, более полезным, а библиотека, подобная lift-json, делает правильные вещи с точки зрения цитирования строк, а не цитирования строк и т. Д.

1 голос
/ 08 марта 2011

Я думаю, что вы ищете что-то вроде Javascript eval() + JSON и Python eval(), str() и repr(). По сути, вам нужна симметрическая мета-круговая оценка Лиспи. Это означает, что вы можете преобразовать данные в исходный код, и оценка этого исходного кода даст вам те же данные, верно?

AFAIK, в Scala нет эквивалента eval(). Даниэль Спивак говорил об этом здесь раньше. Тем не менее, если вы reeeeeealy хотите. Я предлагаю следующие вещи:

  1. Каждый объект коллекции имеет 3 метода, которые позволят вам преобразовать его данные в строковое представление в любом случае. Есть mkString, addString и stringPrefix. Сделайте что-нибудь умное с ними (подумайте, «декомпилируя» ваши ADT в памяти обратно в форму исходного кода), и вы перейдете к шагу 2). По сути, вы можете преобразовать список целых чисел, созданных с помощью List(1,2,3), обратно в строку "List(1,2,3)". Для более базовых литералов, таких как простая строка или целое число, вам нужно объединить встроенные типы, используя имплициты, чтобы предоставить им эти вспомогательные методы toString (здесь я перегружаю термин).
  2. Теперь у вас есть строковое представление, вы можете подумать о том, как его «интерпретировать» или «оценить». Вам понадобится функция eval(), которая создаст новый экземпляр комбинатора синтаксического анализатора, который понимает литералы Scala и заново собирает структуру данных.

Реализация этого на самом деле звучит весело. Не забудьте опубликовать здесь, если вы успешно реализуете его. :)

1 голос
/ 08 марта 2011

Вот что такое сериализация. Кроме того, почему JSON популярен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...