ファイルの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の引数の型は次のようになるだろう。
- Expr
- Array
- otherwise(Any)
Exprのmethodの中では、headの値によって場合わけをするようになるが、Arrayについては、その要素ひとつひとつに同じ名前のmethodを呼び出すような作りになるはずだ。
headの中に、:callがあったら、関数呼出しだと判定してargs[1]を関数名とみなす。
Juliaの予約語については、それぞれで処理がかわる。
otherwiseは、LineNumberNodeなどのExprでもArrayでもないものにたいする処理になる。