使用 scala 宏的 val 或 var 的一般实例

General instances of val or var using scala macro

如何使用宏生成val?

例如,我希望生成此代码:

val test = new Test("arg1")

.. 使用 "simpler" 语法 ..

test := "arg1"

宏是答案吗?如果不是,内部 DSL/implicit 转换?我想避免构建外部 DSL。

如果需要多个参数怎么办?

如果 sbt 是您的灵感之源,那么他们会做一些不平凡的事情。如果您查看 ConsoleProject.scala, you can see that they run Scala compiler themselves and they pass initCommands which is build using imports which in turn includes BuildUtil.getImports,它使用

def baseImports: Seq[String] =
   "import _root_.scala.xml.{TopScope=>$scope}" :: "import _root_.sbt._" :: "import _root_.sbt.Keys._" :: Nil

并导入 Keys.scala define all the setting keys that you can assign with :=. And then they use a bunch of macros defined at TaskMacro.scala 以实现 :=

所以我想说 sbt 使用外部 DSL 和一些巧妙的技巧来使用现有的 Scala 基础架构来编译它,而无需推出成熟的自定义编译器。