我的问题可能是人为的,我想将其视为可行性证明,而不是推荐的东西。为了给你一些背景信息,我会尝试在嵌入式 DSL 中使用与
val myVal = "someContent"
我希望能够做这样的事情:
assign("SomeContent","someVariable") => converted to
someVariable = "SomeContent"
然后在代码的后面,该变量可用。通常我们可以在 REPL 中有类似的东西:
assign("John","name")
println("Hello " + name)
我一直在考虑使用宏(或 ScalaCompiler 插件,但我认为这里更复杂)来解决问题。首先,我不知道这对于宏来说是否可行。
考虑到我只会操纵字符串,我从一些简单的东西开始,我从类似的东西开始
def assign(content: String, targetVal: String):Unit = macro assignMacro
def assignMacro(c:Context)(content: c.Expr[String],
targetVal: c.Expr[String]):c.expr[Unit] = {
import c.universe._
c.Expr[Unit](ValDef(Modifiers(), TermName(targetVal.value),
TypeTree(), Literal(Constant(content.value)))
}
不幸的是,由于几个错误,它似乎失败了
- 首先,当我尝试创建一个新的术语名称时它会抱怨,如果我确定那么我应该调用我的表达式的 eval。不幸的是,我不确定;)如果我尝试,它会失败;)
- 如果我用 myVal 和 myContent 等常量替换此 targetVal 和内容,我会收到第二条错误消息,例如 compiler found and required Unit
我有点卡住了。首先这可能吗?我猜是的;)我怎么能做到这一点?
谢谢您的帮助
此致