我想知道如何实现scala.xml
库,Elem
从XML中获取-instance.
所以我可以写:
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.
"
Run Code Online (Sandbox Code Playgroud)
看一下源代码并没有给我一些见解,这是如何实现的."XML检测"是一种(硬)scala语言功能还是内部DSL?因为我想建立我自己的东西:
var x = LatexCode {
\sqrt{\frac{a}{b}}
}
x.toString
"\sqrt{\frac{a}{b}}"
Run Code Online (Sandbox Code Playgroud)
要么
var y = PythonCode {
>>> import something
>>> something.func()
}
y.toString
"""import something ..."""
y.execute // e.g. passed to python as python-script
Run Code Online (Sandbox Code Playgroud)
要么
object o extends PythonCode {
import x
x.y()
}
o.toString
"""import x...."""
Run Code Online (Sandbox Code Playgroud)
我想避免使用像PythonCode { """import ...""" }
"DSL" 这样的东西.在scala中,XML被神奇地传输到了一个scala.xml
类; 与Symbol
我可以得到的相同val a = 'symoblname
,但在源代码中,没有任何线索如何实现它.
我怎么能在自己身上做这样的事情,最好是作为内部DSL呢?
oxb*_*kes 11
XML是一种scala语言特性(*) - 参见SLS,第1.5节.
我认为字符串插值在2.10中出现,但至少可以让你定义自己的DSL:
val someLatex = latex"""\sqrt{\frac{a}{b}}}"""
Run Code Online (Sandbox Code Playgroud)
这是一个实验性功能,在SIP中得到了更全面的解释,但另外还有多产的Daniel Sobral博客.这当然是(当然)可以在编译时检查String中代码的正确性(好吧,尽可能使用无类型语言:-),你的IDE甚至可以帮助你编写它(好吧,尽可能使用无类型语言:-()
(*) - 考虑到实施的许多缺点,我们可能期望在未来发生变化.我的理解是字符串插值和反xml的组合可能是唯一真正的方法.