在scala中,当你将一个字符串“Hello World”写入它写入的文件时
Hello World
(注意:没有双引号)。
Lisp有一个打印和写入的概念。一个人在没有双引号的情况下写作,另一个包括它们,以便于使用标准阅读器轻松写出数据结构并稍后阅读。
在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'
答案 0 :(得分:1)
这就是序列化的意义所在。另外,为什么JSON很受欢迎。
答案 1 :(得分:1)
查看lift-json(https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/)以写出将被另一种语言解析和读取的数据。 JSON在Web服务领域非常标准,用于请求/响应序列化,并且几乎所有语言都有JSON库。
要字面写出包含双引号的字符串,您还可以执行以下操作:
"""
The word "apple" is in double quotes.
"""
我发现像JSON这样稍微更结构化的格式更有用,而像lift-json这样的库在引用字符串而不引用Ints等方面是正确的。
答案 2 :(得分:1)
我认为你正在寻找像Javascript的eval()
+ JSON,以及Python的eval()
,str()
和repr()
这样的东西。从本质上讲,您需要Lispy对称元循环评估。这意味着您可以将数据转换为源代码,并评估该源代码并返回相同的数据,对吧?
AFAIK,Scala中没有等效的eval()
。 Daniel Spiewak之前已经谈过这个here。但是,如果你想要的话。我建议做以下事情:
mkString
,addString
和stringPrefix
。做一些聪明的事情(想想“反编译”你的内存ADT回到源代码形式),你将到达第2步)。实质上,您可以将List(1,2,3)
创建的整数列表转换回字符串"List(1,2,3)"
。对于更简单的字符串或整数这样的基本文字,你需要使用implicits对内置类型进行操作,以便为它们提供这些toString
(我在这里重载术语)辅助方法。eval()
函数,该函数创建一个解析器组合器的新实例,该组合器可以理解Scala的文字并为您重新组装数据结构。实现这一点听起来很有趣。如果您已成功实施,请不要忘记在此发回。 :)