在Scala中嵌入XML(和其他语言?)

The*_*ius 9 dsl scala

我想知道如何实现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的组合可能是唯一真正的方法.

  • 呃,为什么要downvote?也许我误解了这个问题? (2认同)