Генерация кода с помощью Scala
При использовании инструментальной привязки SBT в Scala можно ли написать задачу, которая будет читать специальную часть источника проекта для генерации scala -кода во время компиляции.
Любые идеи или даже статьи/учебные пособия по этому поводу? Я ищу что-то похожее на Template Haskell.
Ответы
Ответ 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, но не отвечает требованиям ASTA.
Ответ 2
Scala 2.10 имеет экспериментальную поддержку макросов, которые подобно сложной генерации кода компиляции. Подробнее см. здесь.
Есть несколько забавных примеров в репозитории Jason Zaugg macrocosm git, а SLICK библиотека, которая представляет собой эволюцию SQL-запросов 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)
Ответ 3
Недавно я немного поработал. В основном доступны 3 варианта:
- Строковые шаблоны.
- TreeHugger
- Scala Макросы
Подробнее здесь: http://yefremov.net/blog/scala-code-generation/