この章では、文の構成要素となる式について定義する。
演算子の優先順位は、解析表現の定義に基づいて定める。 一つの解析表現に複数の演算子が現れる場合、それらの演算子の優先順位は等しい。 ある解析表現 e1 の中に非終端記号として別の解析表現 e2 が含まれる場合、e2 で定義する演算子の優先順位は e1 で定義する演算子の優先順位よりも高い。
同じ優先順位の中置二項演算子が続けて用いられるとき、それらの演算子を どの順番で適用するかという問題が生じる。#Script では、全ての中置二項演算子は 左結合と右結合のどちらかに分類され、演算子の適用順位は明確に定められる。
同じ優先順位の中置二項演算子同士において、先に書いてあるものから順に演算子を
適用するとき、その中置二項演算子は左結合 (left-associative)であると言う。例えば、式 1 * 2 * 3
において、演算子 * は左結合であるため、この式は
(1 * 2) * 3 と同じように評価する。
同じ優先順位の中置二項演算子同士において、後に書いてあるものから順に演算子を
適用するとき、その中置二項演算子は右結合 (right-associative)であると言う。例えば、式 1 ^ 2 ^ 3
において、演算子 ^ は右結合であるため、この式は
1 ^ (2 ^ 3) と同じように評価する。
前置演算子および後置演算子では、結合法則に関する問題は起こらない。#Script では、前置演算子と後置演算子が同じ優先順位になることは無い。 同じ優先順位の前置演算子または後置演算子を続けて用いるとき、 それらは単純に被演算子に最も近い演算子から順に適用する。
基本式は、式の最小構成要素である。
#? Identifier# (IntegerLiteral
/ #? D)@this KDキーワード @this の評価結果は、[[現在の実行コンテクストの @this 値]] である。
@prec KDキーワード @prec の評価結果は、以下のような参照を値とする正常終了の結果である。
この参照に対する check-reference-value の処理内容は、以下の通りである:
この参照に対する get-reference-value の処理内容は、以下の通りである:
Float オブジェクトを P
とする。ここで P の Float
オブジェクトとしての精度は p の精度 (実行環境が原始制限実数型の値として p を扱っている精度) とする。この参照とオブジェクト O に対する set-reference-value の処理内容は、以下の通りである:
Real オブジェクトでなければ、新しい TypeError
のインスタンスを投げる。OutOfRangeError のインスタンスを投げる。OverflowError のインスタンスを投げる。この参照に対する delete-reference-value の処理内容は、以下の通りである:
UnsupportedOperationError
のインスタンスを投げる。@void KDVoid リテラルの評価結果は、[[初期の Void.void]] である。
@null KDNull リテラルの評価結果は、[[初期の Null.null]] である。
@true KD@false KD真偽値リテラル @true の評価結果は、[[初期の Boolean.true]] である。
真偽値リテラル @false の評価結果は、[[初期の Boolean.false]]
である。
( D) D括弧式を使うと、Expression を Primary として扱うことができる。
Parenthesized: LeftParen Expression RightParen の評価は、Expression を評価し、その結果を返す。
Primary: StringLiteral の評価結果は、[[その文字列リテラルが表す Unicode 文字列を内容とする文字列オブジェクト]] である。
Primary: IntegerLiteral
の評価結果は、以下のような Number オブジェクトを値とする
正常終了の結果である:
Integer オブジェクトが結果となる。Complex
オブジェクトである。このオブジェクトの re プロパティの値は 0 を表す Integer オブジェクトであり、im プロパティの値は、リテラルに ImaginaryMark
が含まれていない場合の評価結果として得られるものと同等の Integer
オブジェクトである。ただし、メモリ不足などのためにリテラルの値を Integer
オブジェクトによって正確に表すことができない場合は、オーバーフローエラーとする。
Primary: FloatLiteral
の評価結果は、以下のような Number オブジェクトを値とする
正常終了の結果である:
Float
オブジェクトである。このオブジェクトの表す実数値は
浮動小数点リテラルの表す値の絶対値であり、
その精度は浮動小数点リテラルの精度である。Complex
オブジェクトである。このオブジェクトの re プロパティの値は 0 を表す Integer オブジェクトであり、im プロパティの値は、リテラルに ImaginaryMark
が含まれていない場合の評価結果として得られるものと同等の Float
オブジェクトである。ただし、メモリ不足などのためにリテラルの値を Float
オブジェクトによって正確に表すことができない場合は、オーバーフローエラーとする。
@inf KD@cinf KD無限大リテラル InfinityLiteral: @inf KD
の評価結果は、[[正の無限大を表す Infinity オブジェクト]] である。
無限大リテラル InfinityLiteral: @cinf KD
の評価結果は、[[複素無限大を表す Infinity オブジェクト]] である。
@nan KDNaN リテラルの評価結果は、[[NaN オブジェクト]] である。
Primary: Identifier の評価は、 次のように行われる:
Primary: # Identifier
の評価は、次のように行われる:
# Identifier を構成する Unicode 文字列を n
とする。(ただし Identifier トークン末尾の D は除く)引数参照式 Primary: # IntegerLiteral の評価は、IntegerLiteral
を I として、左辺式 $args[I]
の評価と同様である。
実行環境は、文法解析において、IntegerLiteral の中に ImaginaryMark
が含まれるような Primary: # IntegerLiteral に遭遇した場合は、
文法エラーとしてよい。
引数参照式 Primary: # # D の評価は、左辺式
$args.count の評価と同様である。
引数参照式 Primary: # D の評価は、引数参照式 #1
の評価と同様である。
@ D
(LeftSquareBracket IdentifierList? RightSquareBracket)?
Block[ D] D, D関数生成式 Function は、新たな関数を生成する。Function を評価するたびに、 関数生成式の内容に基づいて新たな関数オブジェクトが生成され、 それを値とする正常終了が評価結果となる。
生成される関数オブジェクトの詳細については、別途定める。(→関数生成式によって生成される関数)
{ D} Dテンソル生成式は、新たなテンソルを生成する。Tensor を評価するたびに、 テンソル生成式の内容に基づいて新たなテンソルオブジェクトが生成される。 テンソルオブジェクトが問題なく生成されれば、 それを値とする正常終了が評価結果となる。
具体的なテンソルオブジェクトの生成の仕方は、別途定める。(→テンソル生成式の評価)
解析表現 MatrixTester は、行列の各行に含まれる要素の 個数を全て等しくするために存在する。行列の行の要素数が異なっている (つまり行列が長方形でない) 場合、文法エラーとなる。
. D[[ D]] D左辺式は、Primary に 0 個以上のメンバアクセス演算または関数呼出し演算を適用したものである。 メンバアクセス演算および関数呼出し演算は後置演算子として振舞う。
被演算子 A に対するメンバアクセス演算: A Dot Identifier の評価は次のように行う:
被演算子 A に対する関数呼出し演算: A LeftSquareBracket Expressions? RightSquareBracket の評価は次のように行う:
Void.void を
t とする。NotCallableError
のインスタンスを投げる。被演算子 A に対する関数呼出し演算: A LeftSquareBracket2 Expression RightSquareBracket2 の評価は次のように行う:
Void.void を
t とする。NotCallableError
のインスタンスを投げる。被演算子 A に対する関数呼出し演算: A LeftSquareBracket2 Expression Comma Expression RightSquareBracket2 の評価は次のように行う:
NotCallableError
のインスタンスを投げる。++ D-- Dこの後置単項演算は、結合式に 0 回以上後置演算子 ++ (PlusPlus)
または -- (MinusMinus) を適用するものである。
被演算子 A に対する後置単項演算 ++
の評価は次のように行う:
r.$increment[] を評価し、その結果に対して
get-reference-value
を実行し、その結果を s とする。NotAssignableError のインスタンスを投げる。後置単項演算 -- の評価は後置単項演算 ++
の評価と同様である。ただし、左辺式 r.$increment[]
の代わりに左辺式 r.$decrement[] を評価する。
^ / **) D冪演算子は、中置二項演算子である。
被演算子 A, B に対する二項演算 ^ または
** の評価は次の式の評価と同様である:
(A).$power[B]
二つの冪演算子 ^ と **
の効果は全く同じである。#Script では前者の使用を推奨する。
!! D! D@exists KD@delete KD@bind KDこの前置単項演算は、後置単項演算式に以下に定める前置演算子を 0 回以上適用するものである。
被演算子 A に対する前置単項演算 + (Plus)
の評価は次の式の評価と同様である:
(A).$plus[]
被演算子 A に対する前置単項演算 - (Minus)
の評価は次の式の評価と同様である:
(A).$minus[]
被演算子 A に対する前置単項演算 / (Slash)
の評価は次の式の評価と同様である:
(A).$reciprocal[]
被演算子 A に対する前置単項演算 !! (BangBang)
の評価は次のように行う:
Boolean.true]] を、false
なら [[初期の Boolean.false]]
を返す。被演算子 A に対する前置単項演算 ! (Bang)
の評価は次のように行う:
Boolean.false]] を、false
なら [[初期の Boolean.true]]
を返す。被演算子 A に対する前置単項演算 @delete
(DeleteKeyword) の評価は次のように行う:
NotDeletableError
のインスタンスを投げる。被演算子 A に対する前置単項演算 @exists
(ExistsKeyword) の評価は次のように行う:
TypeError
のインスタンスを投げる。被演算子 A に対する前置単項演算 @bind
(BindKeyword) の評価は次のように行う:
$prototype であり、その値は f
である。被演算子 A に対する前置単項演算 ++ (PlusPlus)
の評価は次のように行う:
r.$increment[] を評価し、その結果に対して
get-reference-value
を実行し、その結果を s とする。NotAssignableError のインスタンスを投げる。前置単項演算 -- (MinusMinus) の評価は前置単項演算
++ の評価と同様である。ただし、左辺式 r.$increment[] の代わりに左辺式 r.$decrement[]
を評価する。
( / " / ' / . /
@ / # / {! !=結合式は、連続する一つ以上の Prefix である。連続する Prefix には、 中置二項演算子 [空] による結合演算を適用する。この演算は、左結合である。
被演算子 A, B に対する結合演算の評価は
次の式の評価と同様である:
(A).$juxtapose[B]
JuxtapositionDeterminant は、構文解析において Prefix の後に別の Prefix があるかどうかを判別するための条件を簡略化する。一つ目の Prefix の直後に JuxtapositionDeterminant が当てはまり、かつ二つ目の Prefix の解析に失敗した場合、文法エラーである。
* D/ D\ D% D乗算演算子は、左結合の中置二項演算子である。
被演算子 A, B に対する二項演算 *
(Star) の評価は次の式の評価と同様である:
(A).$multiply[B]
被演算子 A, B に対する二項演算 /
(Slash) の評価は次の式の評価と同様である:
(A).$divide[B]
被演算子 A, B に対する二項演算 \
(Backslash) の評価は次の式の評価と同様である:
(A).$quotient[B]
被演算子 A, B に対する二項演算 %
(Percent) の評価は次の式の評価と同様である:
(A).$mod[B]
+ D- D加算演算子は、左結合の中置二項演算子である。
被演算子 A, B に対する二項演算 + (Plus)
の評価は次の式の評価と同様である:
(A).$add[B]
被演算子 A, B に対する二項演算 - (Minus)
の評価は次の式の評価と同様である:
(A).$subtract[B]
~ D区間生成演算子は区間オブジェクトを生成する。この演算子は二項演算子であるが、左辺・右辺共に省略可能である。
被演算子 A, B
に対する区間生成演算の評価は次の式の評価と同様である:
Interval[A, B,
C, D]
ただし上の評価において、部分式 C の評価結果は、IntervalOperator
の一つ目の EndpointType が Less ならば [[初期の Boolean.false]]、さもなくば [[初期の Boolean.true]] とする。また部分式
D の評価結果は、IntervalOperator の二つ目の EndpointType が Less
ならば [[初期の Boolean.false]]、さもなくば [[初期の Boolean.true]] とする。
この演算子の左辺が省略されているとき、左辺の評価結果は
[[初期の Infinity.negativeInfinity]] とする。
この演算子の右辺が省略されているとき、右辺の評価結果は
[[初期の Infinity.positiveInfinity]] とする。
以下は、区間生成式の例である:
0 < ~ < 1 // 0 から 1 までの開区間
0 <= ~ <= 1 // 0 から 1 までの開区間
0 ~ 1 // 同上
0 ~< // 0 以上の全実数を表す半開区間
<~< // 実数全てを表す開区間
<= D< D>= D> D== D!= D多項関係演算子は、左結合の中置二項演算子である。
被演算子 A, B に対する二項演算 <=
(LessEqual) の評価は次の式の評価と同様である:
(A).$lessEqual[B]
被演算子 A, B に対する二項演算 <
(Less) の評価は次の式の評価と同様である:
(A).$less[B]
被演算子 A, B に対する二項演算 >=
(GreaterEqual) の評価は次の式の評価と同様である:
(A).$greaterEqual[B]
被演算子 A, B に対する二項演算 >
(Greater) の評価は次の式の評価と同様である:
(A).$greater[B]
被演算子 A, B に対する二項演算 ==
(EqualEqual) の評価は次の式の評価と同様である:
(A).$equal[B]
被演算子 A, B に対する二項演算 !=
(BangEqual) の評価は次の式の評価と同様である:
(A).$unequal[B]
=== D!== D二項関係演算子は、中置二項演算子である。
被演算子 A, B に対する二項演算 ===
(EqualEqualEqual) の評価は次のように行う:
Boolean.true]]
を、さもなくば
[[初期の Boolean.false]]
を返す。被演算子 A, B に対する二項演算 !==
(BangEqualEqual) の評価は次の式の評価と同様である:
!(A === B)
&& D|| D? D: D条件演算子 && と ||
は右結合の中置二項演算子である。
被演算子 A, B に対する二項演算 &&
の評価は次のように行う:
Void.void]] を改めて v とする。被演算子 A, B に対する二項演算 ||
の評価は次のように行う:
Void.void]] を改めて v とする。条件演算子 ? : は便宜的に三項演算子として分類される。
Condition: ConditionalOr の評価結果は ConditionalOr の評価結果である。
Condition: ConditionalOr Query Expression Colon Expression の評価は次のように行う:
Void.void]] を改めて c とする。+= D-= D*= D^= D**= D/= D\= D%= D&&= D||= D= D代入演算子は、式の中で最も優先順位が低い中置二項演算子である。 代入演算子は複数の種類があり、種類によって動作が異なる。 代入演算子の種類は、AssignmentOperator から D を除いた部分により決定する。
被演算子 A, B に対する二項演算 = (Equal)
の評価は次のように行う:
NotAssignableError のインスタンスを投げる。被演算子 A, B に対する二項演算 &&=
の評価は次のように行う:
Void.void]] を改めて v とする。NotAssignableError のインスタンスを投げる。被演算子 A, B に対する二項演算 ||=
の評価は次のように行う:
Void.void]] を改めて v とする。NotAssignableError のインスタンスを投げる。被演算子 A, B に対する二項演算
X=
の評価は次のように行う (ここで X とは次の演算子のどれか一つである:
+、-、*、^、**、/、\、%):
NotAssignableError のインスタンスを投げる。& D関数生成演算子は、構文上は前置単項演算子である。
被演算子 A に対する関数生成演算 & (And)
の評価は次の式の評価と同様である: @ { A }
Expression の評価結果は、常に正常終了またはエラー終了である。
複式は、一つ以上の式の配列である。
複式 Expressions: Expression (Comma Expression)* の評価は次のように行う:
値が真であるか偽であるかを判定する操作 to-boolean は一つのオブジェクト
v に対して true または false
のどちらかの値を結果として返す。判定基準は、v がいずれも初期の Void.void、Null.null、Boolean.false、NaN.nan
のどれかなら false、さもなくば true である。