このドキュメント内では、結合優先度の高い演算子から順に記載されています。
因子#
因子は単独で機能するリテラルや括弧類を指します。
因子は演算子の結合において、原子的な性質を持ちます。
後置演算子#
後置演算子は基部の後ろに付与する演算子です。
後置演算子は単項のものと二項のものに分かれ、いずれも左優先結合です。
前置単項演算子の後置表現 value.+ …#
すべての前置単項演算子は、 . に続けて書く後置演算子のバリエーションが存在します。
以下の組はすべて同じ働きをします。
+A A.+
-A A.-
?A A.?
!!A A.!!
!A A.!
&A A.&
$#A A.$#
$&A A.$&
$*A A.$*
\A A.\
後置表現を使うと、一部の構文において丸括弧を削減し、可読性を向上できる場合があります。
前置演算子#
前置演算子は基部の前に付与する演算子です。
前置演算子は右優先結合です。
オブジェクトの継承 parent{entry; ...}#
オブジェクトに { } を後置すると、そのオブジェクトを親とする子オブジェクトを生成します。
オブジェクトの継承は主にメソッドの検索に使われ、エントリーの継承は行われません。
オブジェクトの生成方法はオブジェクトリテラルと共通です。
$ xa '{a: 1; m: this -> 3}{b: 2}'
# {b:2}
$ xa '{a: 1; m: this -> 3}{b: 2}.a'
# NULL
$ xa '{a: 1; m: this -> 3}{b: 2}::m()'
# 3
オブジェクトの要素アクセス object.key#
. 演算子でオブジェクトの要素にアクセスできます。
$ xa '{x: 123}.x'
# 123
オブジェクトが親オブジェクトを持つ場合でも、親オブジェクトの要素は継承されません。
$ xa '{x: 123}{}.x'
# NULL
. の右辺に括弧を置くことで、任意の式によって参照できます。
$ xa '
obj := {item1: 123; item2: 456}
index := 2
obj.("item$index")
'
# 456
. は、右辺が識別子の場合、それを変数ではなくキーとして解釈する性質があります。
したがって、括弧の有無によって参照するエントリーに違いが現れます。
$ xa '
key := "item1"
obj := {key: 123; item1: 456}
[obj.key; obj.(key)]
'
# [123;456]
キーは自動的に文字列化されます。
$ xa '{1: 123}.1'
# 123
Null安全要素アクセス object?.key#
?. 演算子は左辺が NULL の場合に、要素の取得を試みる代わりに NULL を返します。
$ xa '{x: 1}, NULL, {x: 3} | _?.x'
# 1
# NULL
# 3