gpt4 book ai didi

scala - 如何在 Scala 中使用宏创建变量

转载 作者:行者123 更新时间:2023-12-01 02:23:03 25 4
gpt4 key购买 nike

我的问题可能是人为的,我想将其视为可行性的证明,而不是推荐的东西。
为了给您一些上下文,我会尝试在嵌入式 DSL 中使用与

val myVal = "someContent"

我希望能够做这样的事情:
assign("SomeContent","someVariable") => converted to
someVariable = "SomeContent"

然后在代码的后面,变量可用。
通常我们可以在 REPL 中使用类似的东西:
assign("John","name")
println("Hello " + name)

我一直在想宏(或 ScalaCompiler 插件,但我认为这里更复杂)才能做到这一点。
首先,我不知道这对于宏来说是否可行。

考虑到我只会操作 String ,我从一些简单的东西开始,我从类似的东西开始
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 和内容,我会收到第二条错误消息,如已找到编译器并需要单位

  • 我有点卡住了。
    首先这可能吗?我猜是的;)
    我怎么能做到这一点?

    谢谢您的帮助

    此致

    最佳答案

    在 2.10 和 2.11 中,def 宏都扩展为块,这意味着它们引入的定义成为该块的本地定义。这可能会在宏观天堂改变,但我不确定何时以及如何改变。

    目前 Scala 中的宏没有提供透明地将新变量引入现有作用域的方法。这是 Scala 宏进化的历史产物,因为我们的反射组优先考虑了黑盒宏(行为类似于常规方法的宏,完全由它们的类型签名描述,因此人类和程序可以将它们的实现视为黑盒而不会遗漏什么都出来了)。

    最近对白盒宏(不适合黑盒方案的宏)的兴趣产生了一些结果,但这些结果尚未包含在主线 Scala 中。我将在明天在 Strange Loop 的演讲中详细阐述这个问题:https://thestrangeloop.com/sessions/evolution-of-scala-macros .

    同时,您可以查看可能提供您正在寻找的自由度的宏注释。例如,通过适本地定义 mydsl注释,你可以有

    @mydsl 
    def foo = {
    assign("SomeContent", "someVariable")
    ...
    }

    转化成
    def foo = {
    someVariable = "SomeContent"
    ...
    }

    关于scala - 如何在 Scala 中使用宏创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18846782/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com