【发布时间】:2015-03-11 00:07:43
【问题描述】:
我想知道这是否可以用 scala 宏来完成
考虑这种方法:
def doSomething(filter: Item => Boolean) = ...
class Item(properties: Map[String, String]) extends Dynamic {
def selectDynamic(name:String): String = {
properties.getOrElse(name, "")
}
def updateDynamic(name: String)(value: String): Unit = {
addProperty(name, value)
}
}
还有这个用法
doSomething(x=> x.foo == "X" && x.bar == "Y" || x.baz.nonEmpty)
我想做的是简化它(我正在为那些不太使用 scala 的人编写 DSL):
doSomething(foo == "X" && bar == "Y" || baz.nonEmpty)
我的假设是,即使使用 Scala 宏,这也可能是不可能的,不是吗?
如果是这样,我从哪里开始?我认为这不是一个简单的宏...
【问题讨论】:
-
如果
doSomething是一个宏,应该可以启用这个语法。宏可以将doSomething(foo == "X")转换为doSomething{x => import x._; foo == "X"} -
好的,我会尝试深入研究。是否有关于我可以使用的宏的最新资源?
-
嗯...我认为不可能,我需要匹配一个可以递归的未知结构(有没有办法匹配一个“不能真正编译的任意布尔表达式? ")
-
好的,一个方向是通过符号...从 2.11 开始,您可以将名称参数用于宏。所以它可能是可行的,但不确定是否值得努力:)
-
是的,为了使
doSomething(foo == "X")扩展,foo == "X"首先需要类型正确。
标签: scala scala-macros