使用Scala生成代码

时间:2012-07-09 18:13:09

标签: scala code-generation template-haskell

在Scala中使用SBT工具链时,是否可以编写一个任务,该任务将读取项目源的特殊部分,以便在编译时生成scala-code。

关于此的任何想法甚至文章/教程?我正在寻找与Template Haskell相似的东西。

3 个答案:

答案 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种选择:

  1. 字符串模板。
  2. treehugger
  3. Scala Macros
  4. 此处有更多详情:http://yefremov.net/blog/scala-code-generation/