代码生成使用Scala(Code generation with Scala)

2019-07-30 08:05发布

当使用Scala中SBT工具链,是有可能写会读出该项目的源在编译时产生的Scala代码的一个特殊的部分任务。

在这个任何想法,甚至文章/教程? 我寻找,而类似的模板哈斯克尔的东西。

Answer 1:

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。



Answer 2:

斯卡拉2.10对宏其中一样复杂的编译时代码生成实验支持。 请参阅这里了解更多详情。

有贾森Zaugg的的一些有趣的例子宏观 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)


Answer 3:

我做了一些研究最近。 差不多有可用的3个选项:

  1. 字符串模板。
  2. 环境保护狂
  3. 斯卡拉宏

更多详细的活动: http://yefremov.net/blog/scala-code-generation/



文章来源: Code generation with Scala