我想知道如何实现scala.xml
库,以便从XML中获取Elem
- 实例。
所以我可以写:
val xml = {
<myxml>
Some wired text withoud "'s or code like
import x
x.func()
It's like a normal sting in triple-quotes.
</myxml>
}
xml.text
String =
"
Some text wired withoud "'s or code like
import x
x.func()
It's like a normal sting in triple-quotes.
"
看一下源代码并没有给我一些见解,这是如何实现的。 “XML检测”是一种(硬)scala语言功能还是内部DSL?因为我想建立我自己的东西:
var x = LatexCode {
\sqrt{\frac{a}{b}}
}
x.toString
"\sqrt{\frac{a}{b}}"
或
var y = PythonCode {
>>> import something
>>> something.func()
}
y.toString
"""import something ..."""
y.execute // e.g. passed to python as python-script
或
object o extends PythonCode {
import x
x.y()
}
o.toString
"""import x...."""
我想避免使用像PythonCode { """import ...""" }
这样的东西作为“DSL”。在scala中,XML被神奇地传输到scala.xml
- 类;我可以使用Symbol
获得val a = 'symoblname
相同的内容,但在源代码中不知道如何实现此功能。
我如何在自己身上做这样的事情,最好是作为内部DSL?
答案 0 :(得分:11)
XML是一种scala语言功能(*) - 请参阅SLS, 1.5 部分。
我认为string interpolation即将出现在2.10中,这至少可以让您定义自己的DSL:
val someLatex = latex"""\sqrt{\frac{a}{b}}}"""
这是一个在SIP中更全面解释的实验性功能,但另外blogged about by the prolific Daniel Sobral。这当然是(当然)可以在编译时检查String中代码的正确性(好吧,尽可能使用无类型语言:-),你的IDE甚至可以帮助你写它(好吧,尽可能用无类型的语言:-()
(*) - 考虑到实施的许多缺点,我们可能会在未来发生变化。我的理解是字符串插值和反xml的组合可能是一种真正的方式。
答案 1 :(得分:3)
这是一个XML文字,就像"foo"
是一个字符串文字,42
是一个整数文字,12.34
是一个浮点文字,'foo
是一个符号文字,(foo) => foo + 1
是函数文字等等。
Scala的文字比其他语言少(例如,它没有数组文字或regexp文字),但 有XML文字。
请注意,在Scala 2.10中,通过允许您使用StringContext
拦截和重新解释它们,字符串文字变得非常强大 。这些更强大的字符串文字将允许您实现所有片段,包括 XML,而无需单独的语言支持。在将来的语言版本中可能会删除XML文字。