2012-07-09 4 views
12

스칼라에서 SBT 툴 체인을 사용할 때 컴파일 타임에 스칼라 코드를 생성하는 프로젝트 소스의 특별한 부분을 읽는 작업을 작성할 수 있습니까?스칼라로 코드 생성

모든 아이디어 또는 이에 대한 기사/자습서? Template Haskell과 비슷한 것을 찾고 있습니다.

+0

네, 가능합니다. 나는 그것을하는 플러그인이 있다는 것을 확신한다. 기존 플러그인 목록을 살펴 보았습니까? –

답변

13

treehugger.scala 코드 생성을 위해 설계된 라이브러리입니다.

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

treehugger는 AST를 생성하지만, scalac의 AST 비 호환 않습니다

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

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

println(tree) 
println(treeToString(tree)) 

위의 코드는 두 줄을 인쇄합니다.

+5

명확히하기 위해 : treehugger = 소스 코드 생성; 매크로 = AST 생성. 전자는 낮은 기술이며 실제로 이점이 될 수 있습니다. – retronym

+0

@EugeneYokota, Scala 2.10의 가까운 릴리스가 계획되어 있습니까? – jeslg

7

Scala 2.10은 정교한 컴파일 타임 코드 생성을위한 매크로를 실험적으로 지원합니다. 자세한 내용은 here을 참조하십시오.

제이슨 Zaugg의 macrocosm 자식 저장소에 대한 몇 가지 재미있는 사례가 있으며, 형태 보증 된 데이터베이스 (및 수집) 쿼리를 가능하게 ScalaQuery SQL의 DSL의 진화입니다 SLICK 라이브러리는 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) 
+0

언제 완전한 기능을 기대합니까? – Lanbo

+1

저는 컴파일러 개발 팀이 커뮤니티에서 얼마나 유용한지를보기 위해 2.10에서 그것을 시험하고 있다고 생각합니다. 현재의 생각 (몇 주 전에 내부 메일 링리스트를 읽었던 마지막 시점)은 여전히 ​​그들이 실험적으로 만 존재할 가능성을 열어두고 있습니다. 그러나 지역 사회 지원이 매우 긍정적이라면 그들은 그들이 입양 될 것이라고 상상합니다. 이 사이트에는 귀하에게 좀 더 확실한 대답을 줄 수있는 다른 사람들이 있습니다. –

+1

그들은 하스켈 템플릿과 매우 흡사합니다. 널리 사용됩니다. 많은 경우 스칼라가 (클래스를 자동으로 확장하는 것과 같이)이 기능 없이는 잘 작동 할 수 있습니다. 그러나 제 목적을 위해 컴파일시에 자산을 사전 처리하면 적합합니다. – Lanbo