[SCALA] 어디에서 스칼라 매크로 AST의의 구축에 대해 배울 수 있는가?
SCALA어디에서 스칼라 매크로 AST의의 구축에 대해 배울 수 있는가?
나는 어떻게 스칼라의 매크로를 생성하는 AST의의를 구성 배울 수 있습니까?
Scaladoc 내가 원하는만큼 도움이되지 않습니다. 예를 들면 :
abstract def Apply(sym: Universe.Symbol, args: Universe.Tree*): Universe.Tree
A factory method for Apply nodes.
그러나 어떻게 노드가 적용 알아낼 수 있습니까? 어디에서 AST의의 노드 유형의 목록을 찾을 수 있습니다, 어떻게 그들이 서로 맞지?
해결법
-
==============================
1.이 사용할 수있는 컴파일러의 내부에 대한 문서의 많은 아니라, 사용할 수있는 일들이 시작하기에 충분합니다.
이 사용할 수있는 컴파일러의 내부에 대한 문서의 많은 아니라, 사용할 수있는 일들이 시작하기에 충분합니다.
미르코 스토커는 스칼라 리팩토링에 대한 자신의 석사 학위 논문을 작성했습니다. 부록 D (p. 95) 그는 AST의 구조를 설명합니다. 또한 그래픽 개요를 포함합니다 :
대서양 표준시에 대한 정보를 찾을 수있는 또 다른 방법은 AST를 포함 reflect.internal.Trees의 소스에 직접 보는 것입니다.
특정 소스 코드가 표시되는 방법 일 개 필요가 알아 경우 내부적으로 구체화있다 :
scala> import reflect.runtime.universe._ import reflect.runtime.universe._ scala> showRaw(reify{val i = 0}.tree) res8: String = Block(List(ValDef(Modifiers(), newTermName("i"), TypeTree(), Literal(Constant(0)))), Literal(Constant(())))
-
==============================
2.당신은 http://scalamacros.org/talks/ ((http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#trees) 또는 슬라이드에서 scaladoc을 살펴 수 2012-04-28 - MetaprogrammingInScala210.pdf의는) 부분을 "배우고 알아".
당신은 http://scalamacros.org/talks/ ((http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#trees) 또는 슬라이드에서 scaladoc을 살펴 수 2012-04-28 - MetaprogrammingInScala210.pdf의는) 부분을 "배우고 알아".
여기에 내가 보통하는 일입니다. 내가 인수로 스칼라 코드를 소요하고 -Xprint로 컴파일 구문 분석라는 간단한 스크립트를 작성 : 파서 -Ystop-후 : 파서 -Yshow - 나무 -도 캐릭터 라인 -Yshow - 나무 - 소형 (구문 분석은 또 다른 도우미 스크립트를 사용 : 애드혹 -scalac.)뿐만 아니라 그 소스를 보려면 여기를 클릭하십시오.
이 방법은 showRaw에 비해 우수한 장점은 코드의 유형 체킹이 필요하지 않습니다. 당신은 존재하지 않는 변수 나 클래스를 의미 간단한 코드를 쓸 수 있고, 그것은 여전히 성공적으로 실행하고 당신에게 AST를 보여줍니다. 다음은 출력의 예입니다 :
09:26 ~$ parse 'class C { def x = 2 }' [[syntax trees at end of parser]]// Scala source: tmp36sVGp package <empty> { class C extends scala.AnyRef { def <init>() = { super.<init>(); () }; def x = 2 } } PackageDef(Ident(TermName("<empty>")), List(ClassDef(Modifiers(), TypeName("C"), List(), Template(List(Select(Ident(scala), TypeName("AnyRef"))), emptyValDef, List(DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(())))), DefDef(Modifiers(), TermName("x"), List(), List(), TypeTree(), Literal(Constant(2))))))))
이 같은 작업을 수행 유형 체킹라는 스크립트도하지만 TYPER 후 중지합니다. 즉, typechecker 파서 나무를 변환하는 방법을 정확하게 이해하는 것이 때로는 유용하다. 나는 아주 드물게 나무 건설 목적의 유형 체킹 사용하지 않도록 그러나 두 도구 상자와 매크로, 파서 나무와 함께 작동합니다.
from https://stackoverflow.com/questions/14790115/where-can-i-learn-about-constructing-asts-for-scala-macros by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 내가 IntelliJ에있는 스칼라 식의 유형을 보는 방법 (0) | 2019.11.25 |
---|---|
[SCALA] 스칼라의 패턴 매칭 시스템에서 비교 연산자를 사용하여 (0) | 2019.11.25 |
[SCALA] Akka HTTP : 서버 미래의 블록 차단 (0) | 2019.11.25 |
[SCALA] 최고의 스칼라 빌드 시스템은 무엇입니까? [닫은] (0) | 2019.11.25 |
[SCALA] (자바 소스에 혼합했다) 받는다는와 스칼라 응용 프로그램을 구축 (0) | 2019.11.25 |