このドキュメント内では、結合優先度の高い演算子から順に記載されています。

因子#

因子は単独で機能するリテラルや括弧類を指します。

因子は演算子の結合において、原子的な性質を持ちます。

後置演算子#

後置演算子は基部の後ろに付与する演算子です。

後置演算子は単項のものと二項のものに分かれ、いずれも左優先結合です。

前置単項演算子の後置表現 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