式展開

式展開とは、
#{xpress}
が文字列に含まれる場合、XOSの解釈時にxpressをとしてその演算結果と置換する機能のことです。
ダブルクォートで囲まれた文字列は式展開が有効になります。

式展開では四則演算(+,-,*,/)及び括弧()によるグループ化を使った数式が有効です。例えば、
#{4 + 2 * 3}
と記述された場合、括弧の中が計算され(スペースは無視)、10に置換されます。
すなわち、この表現は
10
と全く同じ意味を持つことになります。
定数式は一般に直接結果を記述したほうが見栄えが良くなりますが、変数を使える点で定数表現より優れます。
変数を使う場合、変数名の頭に@を付加します。例えば、
#{@foo * @bar}
と記述したとき、変数fooとbarが<define>によって定義されていた場合、両者に代入された値どうしを乗じた結果に置換されます。
この表現によって、スコアやゲージ量といった動的な情報をオブジェクト要素に使うことができます。
除算/は、除数(割る数)整数なら除算結果は整数(小数点以下四捨五入)に、除数が実数なら除算結果は実数(小数)になります。
値を[]で囲むと括弧内の小数点以下を切り捨てます。

四則演算子は、文字列に対しては加算+と乗算*が有効です。
#{@foo + @bar}
と記述したときに、変数fooに"あいう"、変数barに"えお"が代入されていた場合、あいうえおに置換されます。
#{あいう * 3}
と記述された場合、あいうあいうあいうに置換されます。乗数(*の右側)は自然数でなければなりません。

比較演算子(==,<,>,<=,>=)を用いることで比較演算を行うことができます。
#{@foo >= 4}
と記述された場合、変数fooが4以上である場合はTRUEに、4未満である場合にはFALSEに置換されます。
他の演算子でも同様に、比較演算では必ずTRUEとFALSEのどちらかに置換されます。
整数どうしの比較演算を行う場合、範囲式が有効です。式展開の内部で
1..8
1...9
と記述された場合範囲式になります。範囲式は比較演算の右辺でのみ使用可能で、両者とも1から8までの任意の整数を意味します。".."の場合は終端を含み、"..."の場合は含みません。
#{4 == 3..6}
はTRUEになります。これは
#{(4 >= 3) and (4 <= 6)}
と同じ意味になります。

扱う値が論理値のみの場合、論理演算子(and,or,xor,not)を使うことができます。
#{@foo and @bar}
は、論理値変数@fooと@barが共にTRUEであった場合TRUE、それ以外の場合はFALSEになります。
#{@foo or @bar}
は、論理値変数@fooと@barが共にFALSEであった場合FALSE、それ以外の場合はTRUEになります。
#{@foo xor @bar}
は、論理値変数@fooと@barが異なる論理値であった場合TRUE、同じ論理値であった場合FALSEになります。
#{not @foo}
notは直後にある論理値を反転させます。論理値変数@fooがTRUEならFALSE、FALSEならTRUEになります。
#{@foo and @bar and @baz}
などと(括弧を伴わずに)連続で記述した場合、前にある要素が優先されます。
この場合まず@fooと@barとでand演算が行われ、その結果と@bazとでand演算が行われ、その結果が最終的な結果になります。
括弧でグループ化した場合は括弧の中が優先されます。
論理演算子を論理値の変数以外に対して使う場合、その変数が定義されていれば空文字列はFALSE、それ以外の値はTRUEとして扱われます。

式展開はどのタグの要素と属性にも使うことができますが、要素や属性として求められている形式と置換後の値の形式が一致しない場合、エラーが起こります。
定義されていない変数を参照すると値は必ずFALSEになります。論理演算以外で未定義変数を用いるとエラーとなります。

シングルクォートで囲まれた文字列では式展開が無効になります。
また、シャープ#そのものを使いたい場合、&shと記述することで式展開を回避できます。
要素で式展開を使う場合ダブルクォートは省略できます。逆に式展開を回避したい場合はシングルクォートを明記する必要があります。
最終更新:2015年01月18日 15:14