Scala中关于DSL的元编程

Scala中关于DSL的元编程,scala,metaprogramming,dsl,Scala,Metaprogramming,Dsl,我知道动态语言(Ruby、Clojure、Groovy)提供元编程支持,但是Scala呢 在Scala中是否有用于创建DSL的元编程用例 CaveS/ -我不完全理解元编程,但认为它有助于在运行时处理创建一个新的DSL语法/规则(这可能/可能不正确)。 我读过这篇有用的文章,但我更感兴趣的是为什么要在Scala中使用元编程。Scala中的元编程现在主要围绕Scala宏展开,这是一种相对新的、仍然是实验性的编译时元编程工具 尽管宏相对不成熟和复杂(它们不容易编写),但它们已经在许多项目中使用,

我知道动态语言(Ruby、Clojure、Groovy)提供元编程支持,但是Scala呢

在Scala中是否有用于创建DSL的元编程用例

<代码> CaveS/<代码> -我不完全理解元编程,但认为它有助于在运行时处理创建一个新的DSL语法/规则(这可能/可能不正确)。


我读过这篇有用的文章,但我更感兴趣的是为什么要在Scala中使用元编程。

Scala中的元编程现在主要围绕Scala宏展开,这是一种相对新的、仍然是实验性的编译时元编程工具


尽管宏相对不成熟和复杂(它们不容易编写),但它们已经在许多项目中使用,因为它们在许多方面都很有前途。例如,请参阅本视频:

有了Scala丰富的内部DSL和强大的解析器组合器,我为什么需要宏?我看了那个视频,但不太明白其中的一些原因包括:1)由于编译时代码生成,性能更好,样板更少(例如,解析器组合器速度慢,但由于宏可以使其更快),2)比当前提供的类型更强大的验证,3)直接访问用户编写的DSL程序的结构,而不必通过许多特别安排的方法来传递用户以捕获他们的意图(例如,参见语言集成查询示例)。@KevinMeredith,基于ad-hoc combinators的运行时DSL解释器几乎总是比完全静态、分阶段、精心设计的eDSL编译器更难实现和调试。在几乎所有可能的方面,口译总是比汇编更糟糕。不幸的是,Scala宏非常有限,不像Lisp宏。@SK logic,从概念上讲,我的理解是编译时宏优于运行时规则的计算,因为(1)编译时>运行时。然而,ghik总结了Scala宏当前面临的挑战:
。。。它们的相对不成熟和复杂性(它们不容易编写)
?作为一名非初学者、非专家的Scala开发人员,我发现解析器组合器在实现简单规则方面非常清晰。@SK logic能否详细说明Scala宏设计不当的原因?