【发布时间】:2013-01-31 09:23:30
【问题描述】:
问题
这个问题的动机是试图为this question寻找解决方案。
假设您想使用以下语法构建层次结构:
root {
subA {
subB("b1.1")
subB("b1.2")
}
}
构造 DSL 应该是类型安全的,也就是说,不能将 subB 直接嵌套在 root 中,或者将 subA 嵌套在另一个 subA 中。因此,我的想法是有一个方法root,它返回一个定义方法subA的对象,而后者又返回一个定义subB的对象。
我现在想要的是传递给root的代码块,也就是
subA {
subB("b1.1")
subB("b1.2")
}
的执行使得subB 的调用绑定到root 创建的对象。基本上是这样的
root { r: Root =>
r.subA { sa: SubA =>
sa.subB("b1.1")
sa.subB("b1.2")
}
}
但不必明确接收者 r 和 sa。
问题:是否可以在 Scala 中的代码块中重新绑定接收器,尤其是隐式的 this-receiver - 可能使用宏?
其他方法
This article 描述了一种外观相似的 XML 树构造 DSL。它们的实现基于Dynamic 功能,生成的 DSL 语法如下所示:
xml html {
xml head {
xml title "Search Links"
}
}
但是,这种方法需要显式接收器(此处为对象 xml),更严重的是,我认为它不是类型安全的,因为它会静态阻止您嵌套 html 节点在title 节点内。
【问题讨论】:
标签: scala dynamic compile-time scala-macros