Подтвердить что ты не робот

Генерация кода с помощью Scala

При использовании инструментальной привязки SBT в Scala можно ли написать задачу, которая будет читать специальную часть источника проекта для генерации scala -кода во время компиляции.

Любые идеи или даже статьи/учебные пособия по этому поводу? Я ищу что-то похожее на Template Haskell.

4b9b3361

Ответ 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/