39

Scalaのマクロが生成するASTを構築する方法をどこで学ぶことができますか?

Scaladocは私が望むほど役に立ちません。例えば:

abstract def Apply(sym: Universe.Symbol, args: Universe.Tree*): Universe.Tree
A factory method for Apply nodes.

しかし、Applyノードが何であるかをどのように理解できますか?ASTのノードタイプのリストはどこにあり、それらがどのように組み合わされているのですか?

4

2 に答える 2

40

利用可能なコンパイラの内部に関するドキュメントは多くありませんが、利用可能なもので十分に始めることができます。

Mirko Stockerは、 Scalaリファクタリングに関する修士論文を書いています。付録D(p。95)で、彼はASTのアーキテクチャについて説明しています。グラフィカルな概要も含まれています。

Scala AST

ASTに関する情報を見つける別の方法は、ASTを含むreflect.internal.Treesのソースを直接調べることです。

特定のソースコードスニペットが内部でどのように表現されているかを知る必要がある場合は、次のようになりますreify

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(())))
于 2013-02-09T17:08:25.073 に答える
22

scaladoc(http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#trees)またはスライド(http://scalamacros.org/talks/ )をご覧ください。 2012-04-28-MetaprogrammingInScala210.pdf、「学ぶことを学ぶ」の部分)。

これが私が普段していることです。私は、parseScalaコードを引数として取り、それをコンパイルするという単純なスクリプトを作成しました-Xprint:parser -Ystop-after:parser -Yshow-trees-stringified -Yshow-trees-compactparse別のヘルパースクリプトを使用します:adhoc-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))))))))

と呼ばれるスクリプトもありますtypecheck。これは同じことを行いますが、の後に停止しtyperます。これは、タイプチェッカーがパーサーツリーをどのように正確に変換するかを理解するのに役立つ場合があります。ただし、ツールボックスとマクロの両方がパーサーツリーで機能するtypecheckため、ツリー構築の目的で使用することはめったにありません。

于 2013-02-10T08:30:43.240 に答える