스칼라에서 SBT 툴 체인을 사용할 때 컴파일 타임에 스칼라 코드를 생성하는 프로젝트 소스의 특별한 부분을 읽는 작업을 작성할 수 있습니까?스칼라로 코드 생성
모든 아이디어 또는 이에 대한 기사/자습서? Template Haskell과 비슷한 것을 찾고 있습니다.
스칼라에서 SBT 툴 체인을 사용할 때 컴파일 타임에 스칼라 코드를 생성하는 프로젝트 소스의 특별한 부분을 읽는 작업을 작성할 수 있습니까?스칼라로 코드 생성
모든 아이디어 또는 이에 대한 기사/자습서? Template Haskell과 비슷한 것을 찾고 있습니다.
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))
위의 코드는 두 줄을 인쇄합니다.
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)
언제 완전한 기능을 기대합니까? – Lanbo
저는 컴파일러 개발 팀이 커뮤니티에서 얼마나 유용한지를보기 위해 2.10에서 그것을 시험하고 있다고 생각합니다. 현재의 생각 (몇 주 전에 내부 메일 링리스트를 읽었던 마지막 시점)은 여전히 그들이 실험적으로 만 존재할 가능성을 열어두고 있습니다. 그러나 지역 사회 지원이 매우 긍정적이라면 그들은 그들이 입양 될 것이라고 상상합니다. 이 사이트에는 귀하에게 좀 더 확실한 대답을 줄 수있는 다른 사람들이 있습니다. –
그들은 하스켈 템플릿과 매우 흡사합니다. 널리 사용됩니다. 많은 경우 스칼라가 (클래스를 자동으로 확장하는 것과 같이)이 기능 없이는 잘 작동 할 수 있습니다. 그러나 제 목적을 위해 컴파일시에 자산을 사전 처리하면 적합합니다. – Lanbo
나는 최근에 약간의 연구를했다. 거의 세 가지 옵션이 있습니다.
네, 가능합니다. 나는 그것을하는 플러그인이 있다는 것을 확신한다. 기존 플러그인 목록을 살펴 보았습니까? –