括弧 (value)#
括弧 ( ) は任意の式を内部に含めることができる、何も行わない因子です。
括弧は計算順序の変更などに使うことができます。
$ xa '(1 + 2) * 10'
# 30
括弧内には、実際には複文を書くことができます。
以下のサンプルコードでは、変数 a を0で初期化して、括弧内で a に100を代入し、括弧自体は a + 20 である120を返します。括弧の値は3と和を取られ、結果、プログラムの出力は123になります。
Xarpiteでは、多くのプログラミング言語とは異なり、複文に { } を使うことはできません。
$ xa '
a := 0
(
a = 100
a + 20
) + 3
'
# 123
括弧の内側で宣言された変数は、括弧外に影響を及ぼしません。
$ xa '
a := 10
(
a := 20
OUT << a
a = 30
OUT << a
)
a
'
# 20
# 30
# 10
インデントブロック :#
: の後に改行とインデントを伴う式を記述することで、括弧 ( ) と同等の因子として機能します。
$ xa '
:
1 + 2
'
# 3
括弧と同様に、インデントブロック内には複文を書くことができます。
$ xa '
:
a := 100
b := 20
c := 3
a + b + c
'
# 123
空のインデントブロックの値は NULL です。
$ xa '
:
'
# NULL
括弧の内側と同様に、インデントブロックの内側で宣言された変数は、外側に影響を及ぼしません。
$ xa '
a := 10
:
a := 20
OUT << a
a = 30
OUT << a
a
'
# 20
# 30
# 10
インデントブロックを演算子の右辺に書くことで、場合によっては可読性に寄与します。
$ xa -q '
f := x, y -> :
x + y
a := :
f(10; 20)
a == 30 && :
1 .. 3 | :
OUT << :
a
'
# 30
# 30
# 30
ルートノード#
ルートノードではファイル全体や括弧の直下など、どんな式でも書ける場所のルールを定義します。
複文 runner; ...; getter#
複文は、0個以上の文と複文自体の値となる末尾式を ; で区切って繋いだものです。
以下のサンプルコードにおいて、最後の a の行のみが式(getter)扱いで、その上の3行は文(runner)扱いです。
以下のサンプルコードでは、変数 a を宣言しつつ10を代入し、10が格納されている a の値を出力、次に a に20を代入し、末尾式として20の格納されている a を指定しています。
$ xa '
a := 10;
OUT << a;
a = 20;
a
'
# 10
# 20
末尾式は省略することができます。
その場合、文が末尾式でないことを示すために、末尾に ; が必要となる場合があります。
末尾式が省略された複文の値は常に NULL となります。
$ xa '1 + 2;'
# NULL
$ xa ''
# NULL
複文内での ; の記述は、末尾を除いて柔軟です。
項の前や中間に ; を余計に多く書いても問題ありません。
末尾式の後にはセミコロンを書くことはできません。
また、改行は ; の代わりになります。
$ xa '
a := 10
OUT << a
; ; ; a = 20; ; ;
a
'
# 10
# 20