Code generation with Scala

前端 未结 3 1284
时光取名叫无心
时光取名叫无心 2021-02-13 16:44

When using the SBT toolchain in Scala, is it possible to write a task that will read a special part of the project\'s source to generate scala-code at compile time.

Any

相关标签:
3条回答
  • 2021-02-13 16:54

    I did a bit of research recently. Pretty much there are 3 options available:

    1. String templates.
    2. treehugger
    3. Scala Macros

    More details here: http://yefremov.net/blog/scala-code-generation/

    0 讨论(0)
  • 2021-02-13 17:02

    treehugger.scala is a library designed for code generation.

    import treehugger.forest._
    import definitions._
    import treehuggerDSL._
    
    val tree: Tree = Predef_println APPLY LIT("Hello, world!")
    
    println(tree)
    println(treeToString(tree))
    

    The above code prints two lines:

    Apply(Ident(println),List(Literal(Constant(Hello, world!))))
    println("Hello, world!")
    

    treehugger does generate an AST, but non-compliant to scalac's AST.

    0 讨论(0)
  • 2021-02-13 17:06

    Scala 2.10 has experimental support for macros which alike sophisticated compile-time code generation. See here for more detail.

    There are some fun examples on Jason Zaugg's macrocosm git repository, and the SLICK library which is an evolution of the ScalaQuery SQL DSL enabling type-safe database (and collection) queries to be expressed in a LINQ-like way.

    And this example, from the expecty assertion library:

    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"
    }
    

    Yielding:

    java.lang.AssertionError:
    
    person.say(word1, word2) == "pong pong"
    |      |   |      |      |
    |      |   ping   pong   false
    |      ping pong
    Person(Fred,42)
    
    0 讨论(0)
提交回复
热议问题