Julia Language
式
サーチ…
表現の紹介
式はJuliaのオブジェクトの特定のタイプです。式は、まだ評価されていない(実行されている)ジュリアコードを表していると考えることができます。式を評価するeval()
ような特定の関数と演算があります。
たとえば、スクリプトを書くか、インタプリタに次のように入力することができます。julia> 1 + 1 2
式を作成する1つの方法は、 :()
構文を使用することです。例えば:
julia> MyExpression = :(1+1)
:(1 + 1)
julia> typeof(MyExpression)
Expr
Expr
型のオブジェクトが作成されました。形成されたばかりのものは何もしません。それが作用するまで他のオブジェクトのように周囲に座ります。この場合、 eval()
関数を使って式を評価することができます:
julia> eval(MyExpression)
2
したがって、次の2つが同等であることがわかります。
1+1
eval(:(1+1))
1 + 1が何であるかを見たいだけなら、なぜeval(:(1+1))
のはるかに複雑な構文をeval(:(1+1))
たいのですか?基本的な理由は、コード内のある時点で式を定義し、後でそれを修正し、後で評価することができるということです。これにより、Juliaプログラマにとって強力な新機能が開かれる可能性があります。式はJuliaのメタプログラミングの重要な要素です。
式の作成
同じ種類の式を作成するために使用できるさまざまな方法がいくつかあります。 式の紹介には、 :()
構文があります。おそらく、最も良い場所は文字列です。これは、Juliaの式と文字列の基本的な類似点のいくつかを明らかにするのに役立ちます。
文字列から式を作成する
ジュリアの文書から:
すべてのJuliaプログラムは文字列として始まります
言い換えれば、ジュリアスクリプトは単に文字列であるテキストファイルに書かれています。同様に、インタプリタに入力されたJuliaコマンドは単なる文字列です。 Juliaやその他のプログラミング言語の役割は、論理的で予測可能な方法で文字列を解釈して評価することであり、文字列を使用してプログラマがコンピュータに達成させたいことを記述することができます。
したがって、式を作成する1つの方法は、文字列に適用されるparse()
関数を使用することです。次の式は、一度評価されると、記号x
2の値を割り当てます。
MyStr = "x = 2"
MyExpr = parse(MyStr)
julia> x
ERROR: UndefVarError: x not defined
eval(MyExpr)
julia> x
2
:()
構文を使用して式を作成する
MyExpr2 = :(x = 2)
julia> MyExpr == MyExpr2
true
この構文では、Juliaはシンボルを参照するオブジェクトの名前を自動的に扱います。表現のargs
を見れば、これを見ることができます。 ( 式のargs
フィールドの詳細は、「 式オブジェクトのフィールド」を参照してください。)
julia> MyExpr2.args
2-element Array{Any,1}:
:x
2
Expr()
関数を使用して式を作成する
MyExpr3 = Expr(:(=), :x, 2)
MyExpr3 == MyExpr
この構文は接頭辞表記法に基づいています 。言い換えれば、 Expr()
関数に指定された最初の引数はhead
または接頭辞です。残りは表現のarguments
です。 head
は、引数に対してどのような操作が実行されるかを決定します。
詳細は、「 式オブジェクトのフィールド」を参照してください。
この構文を使用する場合は、オブジェクトにオブジェクトとシンボルを使用するかどうかを区別することが重要です。たとえば、上記の例では、式は2
の値をシンボル:x
に割り当てます。これは完全に分かりやすい操作です。そのような式でx
自身を使用すると、無意味な結果が得られます。
julia> Expr(:(=), x, 5)
:(2 = 5)
同様に、 args
を調べると、次のようになります。
julia> Expr(:(=), x, 5).args
2-element Array{Any,1}:
2
5
したがって、 Expr()
関数は式を作成するための:()
構文と同じ自動変換をシンボルに実行しません。
quote...end
を使って複数行の式を作成する
MyQuote =
quote
x = 2
y = 3
end
julia> typeof(MyQuote)
Expr
quote...end
では、 args
フィールドに他の式を含む式を作成できます。
julia> typeof(MyQuote.args[2])
Expr
このargs
フィールドの詳細については、Expression Objectsのフィールドを参照してください。
式の作成に関する詳細
この例では、式を作成するための基本を説明します。より複雑で高度な式を作成する方法の詳細については、たとえば、「 補間と式」および「式オブジェクトのフィールド 」も参照してください。
式オブジェクトのフィールド
式の紹介で述べたように、式はJuliaの特定のタイプのオブジェクトです。したがって、彼らはフィールドを持っています。式の最もよく使われる2つのフィールドは、そのhead
とそのargs
です。例えば、式
MyExpr3 = Expr(:(=), :x, 2)
式の作成で説明します。我々はhead
とargs
を次のように見ることができます:
julia> MyExpr3.head
:(=)
julia> MyExpr3.args
2-element Array{Any,1}:
:x
2
式は接頭辞表記法に基づいています 。このように、 head
一般に、 args
に対して実行される操作を指定します。頭部はジュリア型Symbol
でなければなりません。
式が値を代入するとき(評価されるとき)、それは一般に:(=)
頭部を使用する。もちろんこれには、使用可能な明白なバリエーションがあります。例:
ex1 = Expr(:(+=), :x, 2)
:表現の頭を呼び出す
式の別の一般的なhead
、 :call
です。例えば
ex2 = Expr(:call, :(*), 2, 3)
eval(ex2) ## 6
接頭辞表記の規則に従って、演算子は左から右に評価されます。したがって、この式は、後続の要素に対してargs
の最初の要素で指定された関数を呼び出すことを意味します。同様に、
julia> ex2a = Expr(:call, :(-), 1, 2, 3)
:(1 - 2 - 3)
あるいは、他の潜在的により興味深い機能、例えば
julia> ex2b = Expr(:call, :rand, 2,2)
:(rand(2,2))
julia> eval(ex2b)
2x2 Array{Float64,2}:
0.429397 0.164478
0.104994 0.675745
:()
式作成記法を使用するときのhead
自動決定
:call
は、式の特定の構成において頭として暗黙的に使用されることに注意してください:call
julia> :(x + 2).head
:call
したがって、式を作成するための:()
構文を使用すると、Juliaは使用する正しい頭部を自動的に決定します。同様に:
julia> :(x = 2).head
:(=)
実際には、例えば、 Expr()
を使って、あなたが形成している式にどのような正しい頭を使うべきか確信が持てないなら、これは何を使うべきかのヒントやアイデアを得るのに役立つツールです。
補間と式
式の作成は、式が文字列と密接に関連していると言います。そのため、文字列内の補間の原則は式にも関係します。たとえば、基本的な文字列補間では、次のようなことができます。
n = 2
julia> MyString = "there are $n ducks"
"there are 2 ducks"
$
記号を使用してn
の値を文字列に挿入します。同様の手法を式で使用できます。例えば
a = 2
ex1 = :(x = 2*$a) ## :(x = 2 * 2)
a = 3
eval(ex1)
x # 4
これとは対照的に、
a = 2
ex2 = :(x = 2*a) # :(x = 2a)
a = 3
eval(ex2)
x # 6
したがって、最初の例では、式が評価される時点で使用されるa
の値を事前に設定します。第二の例では、しかし、ジュリアコンパイラはのみになります私たちの表現のための評価時にその値を見つけること。 a
式に関する外部参照
ジュリアでの表現の知識をさらに深めるのに役立つ多くの有用なWebリソースがあります。これらには、
- Julia Docs - メタプログラミング
- Wikibooks - Juliaメタプログラミング
- グレイ・カルホーンによるジュリアのマクロ、表現など
- ジュリアの月 - メタプログラミング、Andrew Collier著
- ジュリアの象徴的な区別、John Myles White
ああ、