サーチ…


表現の紹介

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

式の作成で説明します。我々はheadargsを次のように見ることができます:

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リソースがあります。これらには、

ああ、



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow