使用Scala生成代码

1l5u6lss  于 2022-11-09  发布在  Scala
关注(0)|答案(3)|浏览(174)

在Scala中使用SBT工具链时,是否可以编写一个任务来读取项目源代码的特殊部分,以便在编译时生成Scala代码。
对此有什么想法,甚至是文章/教程?我正在寻找与模板哈斯克尔相当相似的东西。

tjvv9vkg

tjvv9vkg1#

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。

kuarbcqp

kuarbcqp2#

Scala 2.10试验性地支持类似于复杂的编译时代码生成的宏。有关更多详细信息,请参见here
这里有一些关于Jason Zugg的macrocosm git存储库和SLICK库的有趣示例,SLICK库是ScalaQuery SQL DSL的演变,支持以类似LINQ的方式表示类型安全的数据库(和集合)查询。
下面的示例来自expectyAssert库:

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)
lnxxn5zx

lnxxn5zx3#

最近我做了一些研究。差不多有3个选项可供选择:
1.字符串模板。
1.抱树人
1.Scala宏
更多详细信息请点击此处:http://yefremov.net/blog/scala-code-generation/

相关问题