コンテンツにスキップ

式中で使える関数

このページで解説する文法は必須ではありません。
ERBで出来る全てのことは「式中で使える関数」を使わなくとも(スクリプトが多少長くなるだけで)実行できます。
いままでの文法に不便を感じないのであれば「式中で使える関数」を使用する必要はありません。

「式中で使える関数」はEmuera ver 1.712で追加された新しい文法です。
これは多くのプログラミング言語で単に「関数」と呼ばれるものです。
eramaker basicでは@~~で定義しCALLで呼び出すものを「関数」と呼んでいるため、Emueraでは新しい「関数」を「式中で使える関数」と呼びます。
以下、誤解がない場合には「式中で使える関数」を単に関数と呼びます。

また、他のページでは「式中で使える関数」を略して「式中関数」と呼ぶことがあります。
しかし、他のプログラミング言語における式中関数(匿名関数)やインライン関数とは無関係です。
組み込み関数ではない、ERB中で定義して使う「式中で使える関数」についてはユーザー定義の式中関数を参照してください。

「式中で使える関数」は以下のように使います。

A = ABS(A)  
IF STRLENS(STR:0) > A  
    LOCALS:0 = %SUBSTRING(STR:0, A, 1)%  
ENDIF

これは、
Aの絶対値を求めてAに代入し、
STR:0の文字列長がAよりも大きいならば、
LOCALS:0STR:0A番目の文字を代入する、
というスクリプトです。
上記のスクリプトは以下のように「式中で使える関数」を使わない形で置き換えることができます。

ABS A  
A = RESULT  
STRLENS STR:0  
IF RESULT > A  
    SUBSTRING STR:0, A, 1  
    LOCALS:0 = %RESULTS:0%  
ENDIF

RESULTRESULTSに中間の値が代入されることを除けば、上と全く同じ動作をします。

凡例

以下の解説における記号の説明です。
例えば、

int STRLENS(str s)  
str SUBSTRING(str s, int start = 0, int length = -1)

などのうち、最初のintstrは戻り値の型を表します。
intであれば整数型、strであれば文字列型です。
以下のスクリプトは1行目は正常に動作しますが、2行目はエラーになります。

A = STRLENS("abc")  
A = SUBSTRING("abc", 0, 1)

SUBSTRINGの戻り値はstr、つまり文字列型なので、整数型の変数Aに代入することはできません。 文字列型を返す関数は代入こそできないものの、その他の点では文字列変数と同じように扱うことができます。

STR = %SUBSTRING("abc", 0, 1)%

次のSTRLENSSUBSTRINGが関数の名前になります。

()の中の文字、str sなどは引数を表しています。
引数が複数ある場合は,(カンマ)で区切られます。STRLENSには1つ、SUBSTRINGには3つの引数があります。

引数の最初の単語は引数の型です。
STRLENSの引数は文字列型(str)です。
SUBSTRINGは第1引数が文字列型(str)、第2引数と第3引数が整数型(int)です。
その次のstrstartlengthといった単語は引数の名前です。
引数の名前は解説文の中で使うための便宜上の名前であり、特に意識する必要はありません。

引数の名前の後ろの= 0などはその引数が省略可能であることと、省略した場合のディフォルト値を表します。
以下のスクリプトはどの行も全て同じ意味になります。

STR = SUBSTRING(RESULTS)  
STR = SUBSTRING(RESULTS, 0)  
STR = SUBSTRING(RESULTS, , -1)  
STR = SUBSTRING(RESULTS, 0, -1)

引数の省略の際に最後の引数ではなく途中の引数を省略する場合はSUBSTRING(RESULTS, , -1)のようにどの引数を省略したかがわかるように,を入れる必要があります。
ただし、どの引数を省略されたかが明らかな場合は不要です。
以下のスクリプトはどの行も全て同じ意味になります。

;int RAND(int min = 0, int max)  
A = RAND(100)  
A = RAND( , 100)  
A = RAND(0, 100)

そのほか、

int GETTIME()

は引数が無いことを表しています。この場合でもGETTIME()のように()は必須です(変数と区別するためです)

int FINDCHARA(var key, ? value, int start = 0)

のうち、varは変数型を表します。ここにはTALENTなど変数を渡します。
?は複数の型を受け入れることを示します。
FINDCHARAでは第1引数に指定した変数によって第2引数に渡すべき型が変わります。

int MAX(int n, int m...)

は引数がいくつでも良いことを表しています。

M = MAX(A, B, C, D, E, F, G)

はA~Gの中で一番大きい数字をMに代入します。

EM+EEのドキュメントでは記法が少し変わっています。