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

时间:2012-08-28 12:56:48

标签: scala dsl

我想知道如何实现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?

2 个答案:

答案 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文字。