9

我想知道该scala.xml库是如何实现的,以从 XML 中获取Elem-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.
  "

查看源代码并没有让我了解这是如何实现的。“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-Class;与Symbol我可以得到的相同val a = 'symoblname,但在源代码中不知道这是如何实现的。

我怎样才能对自己做这样的事情,最好是作为内部 DSL?

4

2 回答 2

11

XML 是 Scala 语言特性 (*) - 请参阅SLS的第1.5节。

但是,我认为字符串插值将在 2.10 中出现,这至少允许您定义自己的 DSL:

val someLatex = latex"""\sqrt{\frac{a}{b}}}"""

这是一个实验性功能,在 SIP 中得到了更充分的解释,但多产的 Daniel Sobral 也在博客中提到了这一点。这一点(当然)是可以在编译时检查 String 中代码的正确性(嗯,尽可能使用无类型语言:-),您的 IDE 甚至可以帮助您编写它(嗯,尽可能使用无类型语言:-()

(*) -鉴于实施的许多缺点,我们可能预计这种情况在未来会发生变化。我的理解是字符串插值和反xml的组合可能是一种真正的方式

于 2012-08-28T13:01:53.300 回答
3

它是一个 XML 文字,就像"foo"一个字符串文字、42一个整数文字、12.34一个浮点文字、'foo一个符号文字、(foo) => foo + 1一个函数文字等等。

Scala 的字面量比其他语言少(例如,它没有数组字面量或正则表达式字面量),但它确实有 XML 字面量。

请注意,在 Scala 2.10 中,通过允许您使用s拦截和重新解释它们,字符串文字变得更加强大StringContext这些更强大的字符串文字将允许您实现所有片段,包括XML,而无需单独的语言支持。XML 文字很可能会在该语言的未来版本中被删除。

于 2012-08-28T13:24:59.557 回答