在Scala中使用SBT工具链时,是否可以编写一个任务来读取项目源代码的特殊部分,以便在编译时生成Scala代码。对此有什么想法,甚至是文章/教程?我正在寻找与模板哈斯克尔相当相似的东西。
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。
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)
lnxxn5zx3#
最近我做了一些研究。差不多有3个选项可供选择:1.字符串模板。1.抱树人1.Scala宏更多详细信息请点击此处:http://yefremov.net/blog/scala-code-generation/
3条答案
按热度按时间tjvv9vkg1#
treehugger.scala是一个为代码生成而设计的库。
上面的代码打印两行:
Treehugger确实会生成AST,但不符合scalac的AST。
kuarbcqp2#
Scala 2.10试验性地支持类似于复杂的编译时代码生成的宏。有关更多详细信息,请参见here。
这里有一些关于Jason Zugg的macrocosm git存储库和SLICK库的有趣示例,SLICK库是ScalaQuery SQL DSL的演变,支持以类似LINQ的方式表示类型安全的数据库(和集合)查询。
下面的示例来自expectyAssert库:
让步:
lnxxn5zx3#
最近我做了一些研究。差不多有3个选项可供选择:
1.字符串模板。
1.抱树人
1.Scala宏
更多详细信息请点击此处:http://yefremov.net/blog/scala-code-generation/