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

时间:2017-07-31 22:45:38

标签: scala macros dsl

如何使用宏来生成val?

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

val test = new Test("arg1")

..使用“更简单”的语法..

test := "arg1"

宏是答案吗?如果没有,内部DSL /隐式转换?我想避免构建外部DSL。

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

1 个答案:

答案 0 :(得分:1)

如果sbt是你灵感的来源,那么他们会做一些非平凡的伎俩。如果您查看ConsoleProject.scala,您可以看到他们自己运行Scala编译器并通过使用initCommands构建的importsdef baseImports: Seq[String] = "import _root_.scala.xml.{TopScope=>$scope}" :: "import _root_.sbt._" :: "import _root_.sbt.Keys._" :: Nil 又包含使用BuildUtil.getImports >

:=

导入的Keys.scala定义了您可以使用:=指定的所有设置键。然后他们使用TaskMacro.scala定义的一堆宏来实现Traceback (most recent call last): File "/home/ubuntu/.local/lib/python3.5/site- packages/twisted/internet/defer.py", line 1384, in _inlineCallbacks result = result.throwExceptionIntoGenerator(g) File "/home/ubuntu/.local/lib/python3.5/site- packages/twisted/python/failure.py", line 393, in throwExceptionIntoGe nerator return g.throw(self.type, self.value, self.tb) File "/home/ubuntu/.local/lib/python3.5/site- packages/scrapy/core/downloader/middleware.py", line 43, in process_re quest defer.returnValue((yield download_func(request=request,spider=spider))) twisted.internet.error.ConnectionRefusedError: Connection was refused by other side: 111: Connection refused.

所以我想说sbt使用外部DSL和一些聪明的技巧来使用现有的Scala基础设施来编译它而不需要推出一个完整的自定义编译器。