LoginSignup
0
0

More than 3 years have passed since last update.

Meta.parse()関連の続き

Last updated at Posted at 2019-12-15

ファイルのMeta.parse()の結果

 ファイル全体を文字列として読み込みMeta.parse()をかけると、何かのArray{Any,1}になる。

 REPLで"f(x,g(y))"などをMeta.parse()するとExprだけがかえってくるがファイルから読み込んだstringをMeta.parse()すると、Stringも混在する。さらに、Exprのargsのひとつとして、アノテーションのような情報もはいってくる。

 Stringは、ファイルの中にコメント(文字列)だけの行らしい。

 Exprのheadにはjulia言語をparseしたときの構文要素がはいってくる。関数呼出しを示す:callについてはマニュアルに書いてあったと思うが、それ以外にも代入文は:(=) つまり Symbol("=") がheadになるし、function定義だと headは:functionになる。

 ちなみに、w=Meta.parse(...)し、REPLで

julia> w

 とした場合と、w.head, w.argsで見た場合、あるいはdump(w)した場合、それぞれ表現が違うので確かめながら見ていく必要がある。単に wでみると、一番シンブルな表示になるのだろう。

 dump()でみると Exprでなく、LineNumberNodeというものがargsに含まれるようになる。これはExprではないのでheadを持たない。ファイルの何行目なのかを示すような情報。
REPLでみると

julia> pt[4].args[2].args[1]
:(#= none:15 =#)

julia> dump(pt[4].args[2].args[1])
LineNumberNode
  line: Int64 15
  file: Symbol none

というような表示になる。
LineNUmberNodeのhelpをみると、

  struct LineNumberNode <: Any

  Fields
  ≡≡≡≡≡≡≡≡

  line :: Int64
  file :: Any

となっている。

関数定義の呼び出される関数を再帰的に処理するときの制御

余計なことをひとつ。
Exprの構造を再帰的にたどって処理するときの典型的なmethodの引数の型は次のようになるだろう。

1) Expr
2) Array
3) otherwise(Any)

Exprのmethodの中では、headの値によって場合わけをするようになるが、Arrayについては、その要素ひとつひとつに同じ名前のmethodを呼び出すような作りになるはずだ。
headの中に、:callがあったら、関数呼出しだと判定してargs[1]を関数名とみなす。
Juliaの予約語については、それぞれで処理がかわる。
otherwiseは、LineNumberNodeなどのExprでもArrayでもないものにたいする処理になる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0