Specript Language Reference rev.0.7.0 | www.specript.org |
Specriptでは、処理は全て式として表されます。条件分岐やループなどの制御も、 条件演算子や多分岐演算子、もしくはランタイムライブラリのfunction呼び出しなどの 式によって表現されることとなります。
式は下記の箇所に登場します。
また、補足的に下記の箇所に登場します。
式は次の要素から構成されます。
この内、
は、式の最小構成単位を成し、演算子のオペランド(項)と成り得ます。
式中では、定義されているpropertyを参照したり、functionを呼び出したりすることが できます。
// property "p"が定義されます。 property p:integer = 2; // function "f"が定義されます。 function f(a:integer):integer = a * -1; // property "q"の初期化式中で、property "p"を参照し、function "f"を呼び出しています。 property q:integer = p + f(10); // function "g"の本体式中で、property "p"を参照し、function "f"を呼び出しています。 function g(a:integer):integer = p + f(a);
property、functionが参照、呼び出し可能かどうかは、そのproperty、functionの 所属するnamespaceが、式の記述されるnamespaceから可視であるかどうかによって定まります。
参照、呼び出しするproperty、functionの名称は、namespace付きの‘フルネーム’で指定します。 または、using宣言を行いnamespace部分の記述を省略することができます。あるいは、alias定義を 行いnamespaceの別名を用いた記述を行うこともできます。
引数のあるfunctionを呼び出すとき、各引数には、引き渡す値を表す任意の式を記述することとなります。
property p:integer = 2; // function "f"が定義されます。 function f(a:integer, b:integer):integer = (a + b) * 5; // function "f"呼び出し時、引数に式を記述しています。 property q:integer = p + f(p + 10, (p - 10) * 2);
function定義において引数にデフォルト値式が指定されている場合には、function呼び出し時、 その引数を省略することができます。
また、function呼び出し時、引数名を明示する記法が可能です。
spec定義または匿名specにおいて、要素propertyまたは制約property定義の初期化式、
要素functionまたは制約functionの本体式中では、そのspec自身の値を指し示す一種の
要素propertyとして、予約語"this
"を用いることができます。
record生成式とは、recordタイプの構造を持つ値を式中で‘ad-hoc’に表現するものです。
record生成式は、"{
"〜"}
"内にrecordの要素propertyを
",
"区切りで列挙するように記述します。要素propertyの名称と初期化式は
"=
"で区切ります。
{
"
<要素property名> "=
" <初期化式>
( ",
" <要素property名> "=
" <初期化式> )*
"}
"
{
" "}
"
property p:record = {e = 1, f = "a", g = '2008-03-03'};
function f(a:integer, b:integer):record = { e1 = a, e2 = b, e3 = a + b, e4 = "xyz" };
record生成式中の要素propertyの初期化式には、要素propertyの値を表す任意の式を記述する こととなります。
record生成式では、要素propertyにspecを指定することはできません。要素propertyの specは、常に、暗黙に初期化式の評価結果が表すspecであるとされます。
record生成式で、recordに要素functionを持たせることはできません。
list生成式とは、listタイプの構造を持つ値を式中で‘ad-hoc’に表現するものです。
list生成式は、"[
"〜"]
"内にlist要素を",
"区切りで
列挙するように記述します。
[
"
<list要素の式>
( ",
" <list要素の式> )*
"]
"
[
" "]
"
property p:list<integer> = [1, 4, 5, 3];
function f(a:integer, b:integer):list<integer> = [ a, b, a + b, a - b ];
list生成式の要素には、要素の値を表す任意の式を記述することとなります。ただし、 全ての要素の式の評価結果は、全て同一のspec、もしくは全てがお互いに互換性のあるspecで なければなりません。
map生成式とは、mapタイプの構造を持つ値を式中で‘ad-hoc’に表現するものです。
map生成式は、"[
"〜"]
"内にmapエントリーを",
"区切りで
列挙するように記述します。mapエントリーのキー・ヴァリューは"=>
"で区切ります。
[
"
<キーの式> "=>
" <ヴァリューの式>
( ",
" <キーの式> "=>
" <ヴァリューの式> )*
"]
"
[
" "=>
" "]
"
property p:map<string, integer> = ["A" => 8, "B" => 4, "C" => 5];
function f(a:integer, b:integer):map<string, integer> = [ "A" => a, "B" => b, "C" => a + b, "D" => a - b ];
map生成式のキーとヴァリューには、キーとヴァリューの値を表す任意の式を記述する こととなります。ただし、全てのキーの式の評価結果は、全て同一のspec、もしくは 全てがお互いに互換性のあるspecでなければなりません。かつ、全てのヴァリューの式の 評価結果は、全て同一のspec、もしくは全てがお互いに互換性のあるspecとならなければ なりません。
式中では、任意のリテラルをそのリテラルが表す値を表すものとして記述することができます。
式中では、"(
"〜")
"で括られた式を、演算子のオペランドに
適用することができます。"(
"〜")
"で括られた式の評価が
まず行われ、その評価値を演算子へ適用することとなります。
機能的には演算子の優先順位を変える効果があると言うことができます。
Specriptでは、四則演算子、比較演算子、論理演算子などの基本的な演算子は、C言語や Javaのそれと同等のものをサポートしています。ただし、
+=
"などの複合代入演算子これらはサポートしていません。
その一方、「switch 〜 case 〜」に相当する多分岐演算子やlistに対する
包含演算子("in
")など、Specript固有の演算子が用意されています。
演算子 説明 優先順位 .
要素アクセス 1 [
]
list/mapアクセス .{
}
recordプロジェクション演算子 +
-
正符号/負符号演算子(単項演算子) 2 !
論理NOT演算子(単項演算子) <<
キャスト演算子(単項演算子) *
/
%
乗除算演算子 3 +
-
加減算演算子 4 <
>
<=
>=
大小比較演算子 5 is
is演算子 ==
!=
等値比較演算子 6 =~
正規表現マッチ演算子 in
包含演算子 &&
論理AND演算子 7 ||
論理OR演算子 8 ?
:
条件演算子(三項演算子) 9 ==?
!=?
=~?
in?
<?
>?
<=?
>=?
is?
多分岐演算子(多項演算子) 10
.
")要素アクセス演算子は、オペランドの評価結果に対して、その評価結果のspecに定義されている 要素propertyまたは要素functionへのアクセスを試みる演算子です。
評価結果のspecがrecord、もしくはrecordの派生specである場合、定義されている 要素propertyの参照と要素functionの呼び出しが可能です。評価結果のspecがrecord およびrecordの派生spec以外の場合、定義されている要素functionの呼び出しが可能です。
要素アクセス演算子適用対象がnull
であったときは、常にnull
が
返ります。この場合、要素propertyまたは要素functionとしていかなるものが指定されていても、
無視されます。
[
" 〜 "]
")
list/mapアクセス演算子は、list
の要素、またはmap
の
ヴァリューを取得する演算子です。list
の場合は取得する要素のインデックスを、
map
の場合は取得するヴァリューに対するキーを指定します。
list
の場合、添え字にはインデックスとしてinteger
の値を
引き渡します。添え字の値を表すものとして、任意の式を記述できます。
添え字の評価値が負の値のときは、実行時エラーとなります。添え字の評価値がlist
の
要素数以上のときは、実行時エラーとならず、null
が返ります。
property p:list<string> = ["A", "B", "C"]; // list "p"より、2番目(インデックス"1")の要素を取得します。 property q:string = p[1]; // q == "B"となります。 // listの要素数以上の添え字を指定すると、nullが返ります。 property r:string = p[3]; // r == nullとなります。
map
の場合、添え字にはそのmap
のキーのタイプの値を引き渡します。
添え字の値を表すものとして、任意の式を記述できます。
添え字の評価値をキーとするヴァリューが存在しなかったとき、null
が
返ります。
property p:map<date, string> = [ '2008-01-01' => "A", '2008-01-02' => "B", '2008-01-03' => "C" ]; // map "p"のキーはdateタイプなので、dateの値を添え字に引き渡します。 property q:string = p['2008-01-03']; // q == "C"となります。 // mapに存在しないキーを指定すると、nullが返ります。 property r:string = p['2008-01-04']; // r == nullとなります。
list
、map
いずれの場合も、要素あるいはヴァリュー取得対象の
list
やmap
がnull
であったときは、null
が
返ります。
// nullのlistです。 property p:list<string> = null; // nullであるlistに対するアクセスの結果はnullとなります。 property q:string = p[1]; // q == null となります。 // nullのmapです。 property r:map<date, string> = null; // nullであるmapに対するアクセスの結果はnullとなります。 property s:string = r['2008-01-03']; // s == null となります。
.{
" 〜 "}
")
recordプロジェクション演算子は、record
の要素propertyを取得し、
部分record
を構築する演算子です。
property p:record = { e1 = "A", e2 = 123, e3 = '2008-03-03', e4 = '2008-04-04' }; // record "p"よりプロジェクション演算子で、要素property "e2"と"e4"を取得、 // "e2"、"e4"のみからなるrecordを構築します。 property q:record = p.{e2, e4}; // q == {e2 = 123, e4 = '2008-04-04'}となります。
recordプロジェクション演算子はrecord
へのみ適用できます。また、
record
の要素propertyのみ指定できます。要素functionを取得することは
できません。要素functionが指定された場合、コンパイル時エラーまたは実行時エラーと
なります。
要素propertyがひとつだけ指定された場合も、要素propertyを一つ持つrecord
が
構築されます。
property p:record = { e1 = "A", e2 = 123, e3 = '2008-03-03', e4 = '2008-04-04' }; // プロジェクション演算子で、要素property "e2"のみからなるrecordを構築します。 property q:record = p.{e2}; // q == {e2 = 123}となります。
要素propertyが一つも指定されなかった場合、空のrecord
が構築されます。
property p:record = { e1 = "A", e2 = 123, e3 = '2008-03-03', e4 = '2008-04-04' }; // プロジェクション演算子で、要素propertyが指定されなかった場合、空のrecordが // 構築されます。 property q:record = p.{}; // q == {}となります。
存在しない要素propertyが指定された場合、コンパイル時エラーまたは実行時エラーと なります。
recordプロジェクション演算子適用対象のrecord
がnull
で
あったときは、null
が返ります。この場合、要素propertyとしていかなる
ものが指定されていても、無視されます。
// nullのrecordです。 property p:record = null; // nullであるrecordに対するプロジェクション演算子適用の結果はnullとなります。 property q:record = p.{e2, e4}; // q == null となります。
+
"、"-
")
正符号演算子は、数値系タイプ(integer
、decimal
、
real
)に対して、値の符号をそのまま維持する演算を行います。
負符号演算子は、数値系タイプ(integer
、decimal
、
real
)に対して、値の符号を反転する演算を行います。
正符号/負符号演算子について、適用可能なタイプと振る舞いを下記に示します。
オペランド 振る舞い integer
,decimal
,real
オペランドの評価値について、符号を維持または反転する演算を行い、 得られた値を返します。
!
")
論理NOT演算子は、オペランドのboolean
の値のtrue
、
false
を反転した値を返す演算子です。
オペランドの評価結果がboolean
以外の場合、コンパイル時エラーまたは
実行時エラーとなります。
論理NOT演算子を適用可能なタイプと振る舞いを下記に示します。
オペランド 振る舞い boolean
オペランドの評価値が true
のときfalse
を 返します。オペランドの評価値がfalse
のときtrue
を返します。
<<
")Specriptのキャスト演算子は‘構造的キャスト’を行う演算子です。構造的キャストとは、 recordおよびその派生specにおいて、継承関係に無くとも、要素propertyの定義が 構造的に一致していればキャスト可能とするものです。
「構造的に一致」とは、「キャスト先specの要素propertyと同名の要素propertyが元specに 存在するとき、元specの要素propertyのspecが、キャスト先specの要素propertyのspecと 同一である、または構造的に一致する」ことを表します。 存在するとき、
spec S : { property e1:string; property e2:string; } spec T : { property e1:string; property e2:string; } property p:S = { e1 = 1, e2 = 2; }; // property "p"のspecは"S"であり、"T"とは継承関係に無いので、エラーとなります。 property q:T = p; // コンパイル時エラー // "T"へのキャストを明示することにより、構造的に受け入れ可能なのでエラーとなりません。 property r:T = <<T<< p; // OK spec U : { property e1:string; property e2:integer; // 要素"e2"のタイプがspec "S"と異なります。 } // "S"は"U"に対して構造的に受け入れ不可能なので、キャストをしてもエラーとなります。 property s:U = <<U<< p; // コンパイル時エラー
*
"、"/
"、"%
")
乗除算演算子は、数値系タイプ(integer
、decimal
、
real
)に対して、乗算("*
")、除算("/
")、
剰余算("%
")を行います。
乗除算演算子について、適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い integer
,decimal
,real
integer
,decimal
,real
左オペランドの評価値と右オペランドの評価値について、積、商、または 剰余を求める演算を行い、得られた値を返します。左右オペランドの タイプが異なる場合、暗黙的に、より包括的なタイプへキャストを行った後 演算を行います。
+
"、"-
")integer
, decimal
, real
数値系タイプ(integer
、decimal
、real
)に対する
加減算演算子は、左右オペランドの評価値について加算("+
")、または
減算("-
")を行います。
数値系タイプ(integer
、decimal
、real
)に対する
加減算演算子について、適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い integer
,decimal
,real
integer
,decimal
,real
左オペランドの評価値と右オペランドの評価値について、和または差を求める 演算を行い、得られた値を返します。左右オペランドのタイプが異なる場合、 暗黙的に、より包括的なタイプへキャストを行った後、演算を行います。
string
stringに対しては加算演算子("+
")のみ適用できます。stringに対する
加算演算子は、左右オペランドのstringの値を連結した新たなstringを返します。
property p:string = "abc"; property q:string = "def"; property r:string = p + q; // r == "abcdef"となります。
stringに対する加算演算子について、適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い string
string
左オペランドの評価値と右オペランドの評価値を連結した string
を 返します。
list
listに対して加算演算子("+
")を適用できます。listに対する
加算演算子は、左右オペランドのlistの値を結合した新たなlistを返します。
property p:list<integer> = [2, 3, 3, 4]; property q:list<integer> = [3, 4, 5]; property r:list<integer> = p + q; // r == [2, 3, 3, 4, 3, 4, 5]となります。
listに対する加算演算子は和集合(Union)を取るものではありません。
listに対する加算演算子について、適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い 右オペランドと同一のタイプアーギュメントの list
左オペランドと同一のタイプアーギュメントの list
左オペランドの評価値と右オペランドの評価値を連結した新たな list
を返します。
<
"、">
"、"<=
"、">=
")
大小比較演算子は、左右オペランドの値の大小関係を比較する演算子です。比較の結果を
boolean
の値で返します。
// integerの比較 property p:integer = 5; property q:integer = 6; property r:boolean = p < q; // r == trueとなります。 // stringの比較(stringの場合はUnicodeコードの大小で比較されます。) property s:string = "abc"; property t:string = "abd"; property u:boolean = s < t; // u == trueとなります。 // dateの比較 property v:date = '2007-12-23'; property w:date = '2007-12-25'; property x:boolean = v < w; // x == trueとなります。
大小比較演算子を適用可能なタイプと大小判定条件を下記に示します。適用不可なタイプの 組み合わせだった場合、コンパイル時エラーまたは実行時エラーとなります。
左オペランド 右オペランド 大小判定条件 integer
,decimal
,real
integer
,decimal
,real
左オペランドの評価値と右オペランドの評価値について、値の大小を 比較します。左右オペランドのタイプが異なる場合、暗黙的により包括的な タイプへキャストを行った後、値を比較します。 string
string
文字列を構成する文字のUnicodeコードの大小で比較します。 date
date
date
の表す年月日で、より後の日付の方を「大きい」とします。timestamp
timestamp
timestamp
の表す年月日時分秒ミリ秒で、より後の日時の 方を「大きい」とします。
is
")
is演算子は、左のオペランドの評価値のspecがis
に続いて示されるspecに対して
互換性のあるとき、trueを返す演算子です。
// 制約functionのあるspecを定義します。 spec S : string { constraint function c = length <= 4; } // 値"abcd"はspec "S"に対して互換性があります。 property p:boolean = "abcd" is S; // p == trueとなります。 // 値"abcde"はspec "S"に対してSpec違反を発生させるので、互換性がありません。 property q:boolean = "abcde" is S; // q == falseとなります。 // 値"123"はspec "S"に対して、タイプが異なるので、互換性がありません。 property r:boolean = 123 is S; // r == falseとなります。
is演算子を適用可能なタイプと振る舞いを下記に示します。
オペランド(左) 振る舞い 任意 オペランドの評価値が is
に続いて示されるspecに対して 互換性があるときtrue
を、互換性が無いときfalse
を 返します。
==
"、"!=
")
等値比較演算子は、左右オペランドの値が等しいか否か比較する演算子です。比較の結果を
boolean
の値で返します。Specriptのタイプは全て値扱い(by-value)です。
string
やrecord
についても値による比較が行われます。
// integerの比較 property p:integer = 5; property q:integer = 5; property r:boolean = p == q; // r == trueとなります。 // stringの比較 property s:string = "abc"; property t:string = "abc"; property u:boolean = s == t; // u == trueとなります。 // recordの比較 property v:record = { e1 = 1, e2 = "a" }; property w:record = { e1 = 1, e2 = "a" }; property x:boolean = v == w; // x == trueとなります。
等値比較演算子を適用可能なタイプと等値判定条件を下記に示します。適用不可なタイプの 組み合わせだった場合、コンパイル時エラーまたは実行時エラーとなります。
左オペランド 右オペランド 等値判定条件 integer
,decimal
,real
integer
,decimal
,real
左オペランドの評価値と右オペランドの評価値について、値を比較します。 左右オペランドのタイプが異なる場合、暗黙的により包括的なタイプへ キャストを行った後、値を比較します。 boolean
boolean
左右オペランドの評価値が同一のとき「等しい」とされます。 string
string
文字列を構成する文字のUnicodeコードで比較します。全て一致するとき 「等しい」とされます。 date
date
date
の表す年月日が一致するとき、「等しい」とされます。timestamp
timestamp
timestamp
の表す年月日時分秒ミリ秒が完全に一致するとき、 「等しい」とされます。record
record
要素propertyの数、名称、タイプが全て一致し、それら要素propertyの 値がそれぞれ等しいとき、 record
は「等しい」とされます。 要素propertyの比較は再帰的に行われます。list
list
list
の要素のタイプが同一で、要素の数が等しく、二つのlist
内の同一インデックスの要素の値が全て等しいとき、list
は「等しい」とされます。要素の比較は再帰的に 行われます。map
map
map
のキーとヴァリューのタイプが同一で、エントリー数が 等しく、二つのmap
のキーのセットが完全に一致し、キーに 関連付くヴァリューの値も全てそれぞれ等しいとき、map
は 「等しい」とされます。キーとヴァリューの比較は再帰的に行われます。
=~
")正規表現マッチ演算子は、右オペランドのstringの値を正規表現としたとき、左オペランドの stringの値がそれにマッチした場合にtrueを返す演算子です。
正規表現マッチ演算子はstringにのみ適用できます。左右オペランドの評価結果がstring以外と なる場合、コンパイル時エラーまたは実行時エラーとなります。
property p:string = "abc"; property q:string = "[a-z]*"; property r:boolean = p =~ q; // r == trueとなります。
サポートされる正規表現は、Javaのjava.lang.String.matchesメソッドのサポートするものと 同一です。
正規表現マッチ演算子を適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い string
string
右オペランドの string
の値を正規表現として、 左オペランドのstring
の値がその正規表現にマッチしたときtrue
を、マッチしなかったときfalse
を返します。
in
")
包含演算子は、左オペランドの値が右オペランドのlist
の要素として存在した
場合にtrue
を返す演算子です。
// "l"中に"e"が含まれていた場合に"true"を返す式となっています。 function included(l:list<integer>, e:integer):boolean = e in l;
右オペランドは評価結果が必ずlistとならなければなりません。左オペランドのタイプが listの要素のタイプと合致しない場合はコンパイル時エラーまたは実行時エラーとなります。
property r:boolean = "x" in [1, 2, 3]; // コンパイル時エラー
包含演算子を適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い 右オペランドの list
のタイプアーギュメントと同一のタイプlist
左オペランドの評価値が、右オペランドの list
の要素の 中に存在したときtrue
を、存在しなかったときfalse
を返します。
&&
")
論理AND演算子は、左右オペランドのboolean
の値がともにtrue
の
ときtrue
を返す演算子です。
左オペランドの評価値がfalse
になったとき、右オペランドの評価は行われません。
左右オペランドの評価結果がboolean
以外の場合、コンパイル時エラーまたは
実行時エラーとなります。
論理AND演算子を適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い boolean
boolean
左オペランドの評価値が false
のとき、false
を 返します。左オペランドの評価値がtrue
のとき、初めて 右オペランドを評価してそのboolean
の値を返します。
||
")
論理OR演算子は、左右オペランドのboolean
の値のいずれかがtrue
の
ときtrue
を返す演算子です。
左オペランドの評価値がtrue
になったとき、右オペランドの評価は行われません。
左右オペランドの評価結果がboolean
以外の場合、コンパイル時エラーまたは
実行時エラーとなります。
論理OR演算子を適用可能なタイプと振る舞いを下記に示します。
左オペランド 右オペランド 振る舞い boolean
boolean
左オペランドの評価値が true
のとき、true
を 返します。左オペランドの評価値がfalse
のとき、初めて 右オペランドを評価してそのboolean
の値を返します。
?
" 〜 ":
" 〜)条件演算子は「if 〜 else 〜」に相当する三項演算子です。
// "x"が正、負、零であるか判断し、それぞれ"1"、"-1"、"0"を返す式となっています。 function sign(x:integer):integer = x > 0 ? 1 : x < 0 ? -1 : 0;
条件演算子を適用可能なタイプと振る舞いを下記に示します。
第1オペランド 第2オペランド 第3オペランド 振る舞い boolean
第3オペランドと同一のタイプ 第2オペランドと同一のタイプ 第1オペランドの評価値が true
のとき、第2オペランドを 評価しその値を返します。第1オペランドのboolean
の値がfalse
のとき、第3オペランドを評価しその値を返します。
多分岐演算子は「switch 〜 case 〜」に相当する多項演算子です。等値比較演算子、 正規表現マッチ演算子、包含演算子、大小比較演算子、is演算子に対応したバリエーションが あります。
==?
?
:
等値比較演算子(" ==
")に対応するバリエーション!=?
?
:
等値比較演算子(" !=
")に対応するバリエーション=~?
?
:
正規表現マッチ演算子(" =~
")に対応するバリエーションin?
?
:
包含演算子(" in
")に対応するバリエーション<?
?
:
大小比較演算子(" <
")に対応するバリエーション>?
?
:
大小比較演算子(" >
")に対応するバリエーション<=?
?
:
大小比較演算子(" <=
")に対応するバリエーション>=?
?
:
大小比較演算子(" >=
")に対応するバリエーションis?
?
:
is演算子(" is
")に対応するバリエーション
第1項に値の比較を行う式、nを1以上として第2n項に第1項の値の比較対象となる式、 第2n+1項に第2n項の値に関する比較が成立した場合に返す値を表す式、を記述します。
// 等値比較演算子に対応したバリエーションです。 // "x"が"1"に等しいとき"A"を、"2"に等しいとき"B"を、"3"に等しいとき"C"を返す式と // なっています。 function branching1(x:integer):string = x ==? // switchに相当します。 1 ? "A" : // caseに相当します。 2 ? "B" : // caseに相当します。 3 ? "C" // caseに相当します。 ; // 正規表現マッチ演算子に対応したバリエーションです。 // "x"が数字のみの場合"1"を、英字のみの場合"2"を、英数字混在している場合"3"を返す // 式となっています。 function branching2(x:string):integer = x =~? "[0-9]*" ? 1 : "[a-zA-Z]*" ? 2 : "[a-zA-Z0-9]*" ? 3 ; // 包含演算子に対応したバリエーションです。 // "x"が"a"、"b"、"c"いずれかであった場合"1"を、"p"、"q"、"r"いずれかであった場合"2"を、 // "x"、"y"、"z"いずれかであった場合"3"を返す式となっています。 function branching3(x:string):integer = x in? ["a", "b", "c"] ? 1 : ["p", "q", "r"] ? 2 : ["x", "y", "z"] ? 3 ; // 大小比較演算子に対応したバリエーションです。 // "x"が"30"以上のとき"A"を、"20"以上のとき"B"を、"10"以上のとき"C"を返す式と // なっています。 function branching4(x:integer):string = x >=? 30 ? "A" : 20 ? "B" : 10 ? "C" ;
多分岐演算子には、大小比較演算子に対応したバリエーションを除いて「default」に相当する 記述はできません。
// 「default」に相当する項を記述しようとしてもコンパイル時エラーとなります。 function branching5(x:integer):string = x ==? 1 ? "A" : 2 ? "B" : 3 ? "C" : "D" // コンパイル時エラー ; // 大小比較演算子に対応するバリエーションでのみ「default」に相当する項を記述できます。 function branching6(x:integer):string = x >=? 30 ? "A" : 20 ? "B" : 10 ? "C" : "D" // OK、"10"未満の場合"D"となります。 ;
大小比較演算子に対応するバリエーション以外、または大小比較演算子に対応するバリエーションで 「default」相当項が存在しない場合、いずれの第2n項に関する比較も成立しなかったときは、 実行時エラーとなります。
function branching(x:integer):string = x ==? 1 ? "A" : 2 ? "B" : 3 ? "C" ; // "x"が"1"〜"3"のいずれにもマッチしなかった場合、実行時エラーとなります。 property p:string = branching(4); // 実行時エラー
多分岐演算子を適用可能なタイプと振る舞いを下記に示します。
第1オペランド 第2nオペランド 第2n+1オペランド 最終オペランド 振る舞い 対応する二項演算子の左オペランドに適用可能なタイプ 対応する二項演算子の右オペランドに適用可能なタイプ 全ての第2n+1オペランドは同一のタイプ 第2n+1オペランドと同一のタイプ
(※大小比較演算子に対応するバリエーションでのみ記述可能)第1オペランドの評価値を左オペランド、第2nオペランドの評価値を 右オペランドとして対応する二項演算子を適用して true
と なったとき、第2n+1オペランドの評価値を返します。
いずれの第2nオペランドについてもtrue
とならなかったとき、 最終オペランドが存在すれば最終オペランドの評価値を返却、 最終オペランドが存在しないときは実行時エラーとなります。
数値系タイプ(integer
、decimal
、real
)の値に
対して、
が適用されるとき、左右オペランドのタイプが異なった場合、数値系タイプ間で暗黙の キャストが行われます。
左(右)オペランドのタイプ 右(左)オペランドのタイプ 暗黙のキャスト後のタイプ integer
decimal
decimal
integer
real
real
decimal
real
real
real
からdecimal
またはinteger
へ、decimal
から
integer
へは、暗黙にキャストされることはありません。
decimal
からreal
へ暗黙のキャストが行われるとき、real
タイプとして
表現できない大きさまたは小ささの値であった場合、実行時エラーとなります。
*
)T.B.D.
/
)除算の場合の振る舞いについて、詳細を示します。
左オペランド(被除数) 右オペランド(除数) 振る舞い integer
integer
商は、小数第一位以下を切り捨て、演算結果値も integer
と なります。decimal
decimal
T.B.D. real
real
T.B.D.
%
)T.B.D.
(c)2007-2008, Specript Development Team | Last Updated: 2008-03-06 |