ScalaでSBTツールチェーンを使用する場合、プロジェクトのソースの特別な部分を読み取ってコンパイル時にscalaコードを生成するタスクを作成することは可能ですか。
これに関するアイデアや記事/チュートリアルさえありますか?テンプレートHaskellにかなり似たものを探しています。
ScalaでSBTツールチェーンを使用する場合、プロジェクトのソースの特別な部分を読み取ってコンパイル時にscalaコードを生成するタスクを作成することは可能ですか。
これに関するアイデアや記事/チュートリアルさえありますか?テンプレートHaskellにかなり似たものを探しています。
treehugger.scalaは、コード生成用に設計されたライブラリです。
import treehugger.forest._
import definitions._
import treehuggerDSL._
val tree: Tree = Predef_println APPLY LIT("Hello, world!")
println(tree)
println(treeToString(tree))
上記のコードは2行を出力します。
Apply(Ident(println),List(Literal(Constant(Hello, world!))))
println("Hello, world!")
treehuggerはASTを生成しますが、scalacのASTに準拠していません。
Scala 2.10は、洗練されたコンパイル時のコード生成と同様に、マクロを実験的にサポートしています。詳細については、こちらをご覧ください。
JasonZauggのmacrocosmgitリポジトリ、およびタイプセーフなデータベース(およびコレクション)クエリをLINQのような方法で表現できるようにするScalaQuerySQLDSLの進化形であるSLICKライブラリにいくつかの楽しい例があります。
そして、この例は、期待されるアサーションライブラリからのものです。
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)
最近少し調べました。利用可能なオプションはほぼ3つあります。
詳細はこちら: http: //yefremov.net/blog/scala-code-generation/