や、言語関係など覚えたいもの、覚えるべきものはたくさんある一方で、注目が集まっているから、やってみたい。ということでプログラミング言語としてのを学んでいく。
2. Juliaの言語機能
2.8 メタプログラミング
メタプログラミングは、プログラムを使ってプログラミングをする手法を指す。たとえばプログラミングを用いたコードの生成や書き換えがメタプログラミングである。
はメタプログラミングを比較的多用する。メタプログラミングを活用することで、複雑なコードを実行時に生成したり、冗長なコードの反復を回避したりする。
2.8.1 シンボル
シンボルは、で扱うデータ型の一種で、処理系の内部で使われる識別子に対応する。シンボルのオブジェクトは:という風に、生成したい識別子の前にコロンを置くことで生成できる。
2.8.2 構文木の表現・補間・評価
の有用なところは、プログラム自体をプログラムで操作する能力である。 はプログラムのコードをのデータ構造として持つことができ、コードを書き換えることができる。コードの多くはシンボルで構成されるため、シンボルをうまく操ってプログラムを生成する必要がある。
################ ### シンボル ### ################ expr = :(x+1) println(expr) # 型 println(typeof(expr)) ################## ### メタプログラミングを実行してみる x = 10 y = -5 # Exprとシンボルを用いたコードの生成 out = eval(Expr(:call, :+, :x, 1)) println(out) # :を用いる out = eval(:(x + 1)) println(out) # macroを用いる macro x_plus_one(x) :($x + 1) end @x_plus_one(y)
## 補間 ex = :(3y + 1) ex2 = :(2x + $(ex)) # 補間 println(ex2) ## 評価 x = 4 y = 5 println(eval(ex2))
このとき、評価がモジュールのグローバルスコープで行われることに注意。
マクロは与えられたコードを別のコードに変換してから実行するための仕組みである。の処理系がマクロ呼び出しに渡されたコードを変換して別のコードに置き換える処理をマクロの展開という。
2.8.3 マクロの定義
では、関数やデータ型と同様、新しいマクロを定義できる。そのためにはキーワードを用いる。
macro マクロ名(引数1,引数2, ...) マクロ本体 end
マクロ展開において、デフォルトでは識別子はグローバル変数に変換される。しかし以下のいずれかに該当する場合、ローカル変数に変換される。
- 宣言無しで代入されたとき
- 宣言があるとき
- 関数定義の引数であるとき