13

ScalaでSBTツールチェーンを使用する場合、プロジェクトのソースの特別な部分を読み取ってコンパイル時にscalaコードを生成するタスクを作成することは可能ですか。

これに関するアイデアや記事/チュートリアルさえありますか?テンプレートHaskellにかなり似たものを探しています。

4

3 に答える 3

13

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に準拠していません。

于 2012-07-09T18:49:14.673 に答える
7

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)
于 2012-07-09T18:17:34.543 に答える
5

最近少し調べました。利用可能なオプションはほぼ3つあります。

  1. 文字列テンプレート。
  2. ツリーハガー
  3. Scalaマクロ

詳細はこちら: http: //yefremov.net/blog/scala-code-generation/

于 2015-01-08T17:55:48.603 に答える