복붙노트

[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. ==============================

    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. ==============================

    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 파서 나무를 변환하는 방법을 정확하게 이해하는 것이 때로는 유용하다. 나는 아주 드물게 나무 건설 목적의 유형 체킹 사용하지 않도록 그러나 두 도구 상자와 매크로, 파서 나무와 함께 작동합니다.

  3. from https://stackoverflow.com/questions/14790115/where-can-i-learn-about-constructing-asts-for-scala-macros by cc-by-sa and MIT license