在Scala中使用SBT工具链时,是否可以编写一个任务,该任务将读取项目源的特殊部分,以便在编译时生成scala-code。
关于此的任何想法甚至文章/教程?我正在寻找与Template Haskell相似的东西。
答案 0 :(得分:13)
treehugger.scala是一个专为代码生成而设计的库。
import treehugger.forest._
import definitions._
import treehuggerDSL._
val tree: Tree = Predef_println APPLY LIT("Hello, world!")
println(tree)
println(treeToString(tree))
以上代码打印两行:
Apply(Ident(println),List(Literal(Constant(Hello, world!))))
println("Hello, world!")
treehugger会生成AST,但不符合scalac的AST。
答案 1 :(得分:7)
Scala 2.10对宏的实验性支持,类似于复杂的编译时代码生成。有关详细信息,请参阅here。
在Jason Zaugg的macrocosm git存储库和SLICK库中有一些有趣的例子,它是ScalaQuery SQL DSL的演变,支持类型安全的数据库(和集合)查询。类似LINQ的方式。
这个例子来自expecty断言库:
import org.expecty.Expecty
case class Person(name: String = "Fred", age: Int = 42) {
def say(words: String*) = words.mkString(" ")
}
val person = Person()
val expect = new Expecty()
...
val word1 = "ping"
val word2 = "pong"
expect {
person.say(word1, word2) == "pong pong"
}
产量:
java.lang.AssertionError:
person.say(word1, word2) == "pong pong"
| | | | |
| | ping pong false
| ping pong
Person(Fred,42)
答案 2 :(得分:5)
我最近做了一些研究。几乎有3种选择: