如何使用宏来生成val?
例如,我希望生成此代码:
val test = new Test("arg1")
..使用“更简单”的语法..
test := "arg1"
宏是答案吗?如果没有,内部DSL /隐式转换?我想避免构建外部DSL。
如果需要多个参数怎么办?
答案 0 :(得分:1)
如果sbt是你灵感的来源,那么他们会做一些非平凡的伎俩。如果您查看ConsoleProject.scala,您可以看到他们自己运行Scala编译器并通过使用initCommands
构建的imports
,def 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基础设施来编译它而不需要推出一个完整的自定义编译器。