2012-07-09 5 views
12

Scala'da SBT takım zincirini kullanırken, derleme zamanında scala-code oluşturmak için projenin kaynağının özel bir bölümünü okuyacak bir görev yazmak mümkündür.Scala ile Kod Üretme

Bu konuda herhangi bir fikir, hatta makale/eğitim var mı? Template Haskell'e benzer bir şey arıyorum.

+0

Evet, bu mümkün. Eminim ki bunu yapan eklentiler vardır. Mevcut eklentiler listesine baktınız mı? –

cevap

13

treehugger.scala kod üretimi için tasarlanmış bir kütüphanedir.

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

Treehugger bir AST oluşturmak ancak scalać en AST uyumlu olmayan etmez:

import treehugger.forest._ 
import definitions._ 
import treehuggerDSL._ 

val tree: Tree = Predef_println APPLY LIT("Hello, world!") 

println(tree) 
println(treeToString(tree)) 

Yukarıdaki kod iki satır basar.

+5

Sadece açıklamak gerekirse: treehugger = kaynak kod üretimi; Makrolar = AST üretimi. Birincisi, aslında bir avantaj olabilir :) daha düşük teknoloji, Scala 2.10 için yakındaki bir sürüm planlanmış mı? – retronym

+0

@EugeneYokota? – jeslg

7

Scala 2.10, karmaşık derleme zamanı kod oluşturulmasına benzer makrolar için deneysel destek sunar. Daha fazla ayrıntı için bkz. here.

Jason Zaugg en macrocosm git depo üzerinde bazı eğlenceli örnekleri vardır ve tip-güvenli veritabanı (ve toplama) sorguları sağlayan ScalaQuery SQL DSL genişletilmiş halidir SLICK kütüphane bir LINQ benzeri şekilde ifade edilmesi. expecty iddia kütüphanesinden

Ve bu örnek

:

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

Verim:

java.lang.AssertionError: 

person.say(word1, word2) == "pong pong" 
|  | |  |  | 
|  | ping pong false 
|  ping pong 
Person(Fred,42) 
+0

Tam bir özellik ne zaman bekleniyor? – Lanbo

+1

Derleyici geliştirme ekibinin, topluluğun onları ne kadar yararlı bulduğunu görmek için onları 2.10'da denediğini düşünüyorum. Şu anki düşünce (birkaç hafta önce internals listesini okuduğumdan beri) onları hala deneysel olarak deneyimleme olasılığını açık bırakıyor. Ancak toplum desteği çok olumluysa, benimseneceklerini hayal ediyorum. Bu sitede, size daha kesin bir cevap verebilecek başkaları da var. –

+1

Template Haskell'e çok benziyorlar ve bu yaygın olarak kullanılıyor. Scala'nın bu kadar iyi hizmet verebileceği birçok durumda (karmaşık sınıflar için otomatik uzantı gibi). Ama benim amacım için, ön işleme varlıklarını derlemek üzerine, uygun. – Lanbo