「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年12月10日改訂)。

MENU

Juliaを基礎からゆっくりと(その09/18)

 \mathrm{R}\mathrm{Python}\mathrm{C}言語関係など覚えたいもの、覚えるべきものはたくさんある一方で、注目が集まっているから、やってみたい。ということでプログラミング言語としての\mathrm{Julia}を学んでいく。

2. Juliaの言語機能

2.8 メタプログラミング

 メタプログラミングは、プログラムを使ってプログラミングをする手法を指す。たとえばプログラミングを用いたコードの生成や書き換えがメタプログラミングである。
 \mathrm{Julia}メタプログラミングを比較的多用する。メタプログラミングを活用することで、複雑なコードを実行時に生成したり、冗長なコードの反復を回避したりする。

2.8.1 シンボル

 シンボルは、\mathrm{Julia}で扱うデータ型の一種で、処理系の内部で使われる識別子に対応する。シンボルのオブジェクトは:\mathrm{foo}という風に、生成したい識別子の前にコロンを置くことで生成できる。

2.8.2 構文木の表現・補間・評価

 \mathrm{Julia}の有用なところは、プログラム自体をプログラムで操作する能力である。 \mathrm{Julia}はプログラムのコードを\mathrm{Julia}のデータ構造として持つことができ、コードを書き換えることができる。コードの多くはシンボルで構成されるため、シンボルをうまく操ってプログラムを生成する必要がある。

################
### シンボル ###
################

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))

 このとき、評価がモジュールのグローバルスコープで行われることに注意。
 マクロは与えられたコードを別のコードに変換してから実行するための仕組みである。\mathrm{Julia}の処理系がマクロ呼び出しに渡されたコードを変換して別のコードに置き換える処理をマクロの展開という。

2.8.3 マクロの定義

 \mathrm{Julia}では、関数やデータ型と同様、新しいマクロを定義できる。そのためには\mathrm{macro}キーワードを用いる。

macro マクロ名(引数1,引数2, ...)
    マクロ本体
end

マクロ展開において、デフォルトでは識別子はグローバル変数に変換される。しかし以下のいずれかに該当する場合、ローカル変数に変換される。

  • \mathrm{global}宣言無しで代入されたとき
  • \mathrm{local}宣言があるとき
  • 関数定義の引数であるとき
プライバシーポリシー お問い合わせ