コンテンツにスキップ

EVAL

Category: メタ操作・特殊関数

書式

EVAL( string )

引数

Parameter Description
string YAYA スクリプトとして実行するテキスト文字列。式ひとつか、文の並び(Tc574-6 / Tc602-9以降)

戻り値

  • 成功時: 実行した結果。代入だけで出力がないときは VOID(返り値なし)
  • 解析に失敗したとき: 引数の文字列をそのまま返す

解説

引数の文字列を YAYA スクリプトとして実行します。式の展開や実行時の関数名合成などに使えます。

式ひとつ

文字列が式ひとつなら、その式を評価した値を返します。代入の式は呼び出し元の変数に代入されます。

_x = EVAL('1 + 2')          // 3
EVAL('_name = "Emily"')     // 呼び出し元のローカル変数 _name に代入される

文の並び(Tc574-6 / Tc602-9以降)

クォートの外に ;、{、}、改行のどれかがあるか、先頭の語が return if while for foreach switch void parallel のどれかであれば、文の並びとして実行します。関数の本体の { } の中に書くのと同じように書けます。

_r = EVAL('_a = 1; _b = _a + 2; _b')   // 3

_r = EVAL('if _hour < 12 { "おはよう" } else { "こんにちは" }')

_r = EVAL('_s = 0; foreach _list; _v { _s += _v }; _s')

ヒアドキュメントなどで改行を含む文字列を渡せば、辞書に書くのと同じ形で書けます。改行は ; と同じく文の区切りになり、// や /* */ のコメント、行末の / による行の結合も使えます。

_code = <<'
_s = 0
for _i = 1; _i <= 10; _i++ {
    _s += _i
}
_s
'>>
_r = EVAL(_code)   // 55

Tc574-8 / Tc603-1以降では、渡すコードの中にもヒアドキュメントを書けます。

返り値は関数の返り値と同じ規則で決まります。出力になる式が複数あればその中から選ばれ、-- で出力を連結でき、return を書けばそこで実行を終えてその値を返します。

文の並びは、呼び出し元の { } の中にブロックをひとつ書いたのと同じように実行されます。

  • 呼び出し元のローカル変数(_argv や _argc を含む)は読み書きできる
  • 中で新しく作ったローカル変数は、EVAL が終わると消える
  • break / continue / return は EVAL の中で完結し、呼び出し元のループや関数には影響しない
Foo
{
    _count = 1
    _r = EVAL('_count += 10; _tmp = _count * 2; _tmp')
    // _r は 22、_count は 11、_tmp はここでは存在しない
}

関数の定義や #define などのプリプロセッサは書けません。関数を定義したいときは APPEND_RUNTIME_DIC を使います。

クォートの中の ; { } や改行は区切りとして扱いません。EVAL('"a;b"') や、改行を含む文字列を " で囲んで埋め込み要素を展開する使い方は、これまでどおり式ひとつとして評価されます。

文字列に " や % を含めるとき

EVAL に渡す文字列の中でダブルクォートを使うときは、CHR(34) を使う。たとえば、変数 i に "test" を代入するには、次のように書く(Tc569-8 以降は、"" と2つ続けて書く方法もある。値と変数)。

EVAL("i=%(CHR(34))test%(CHR(34))")

% の展開を EVAL の実行時に行いたいときも、% を CHR(37) にする。次の例は、"%(foo)" を実行する。

EVAL("%(CHR(34))%(CHR(37))(foo)%(CHR(34))")

EVAL の結果を文字列に変換する TOSTR(EVAL("formula")) と、埋め込み展開 "%(formula)" は、同じ結果をもたらす。

使用例

EVAL("i=1")

EVAL("i=%(CHR(34))test%(CHR(34))")

EVAL("%(CHR(34))%(CHR(37))(foo)%(CHR(34))")

EVAL('_n = 0; while _n < 3 { _n++ }; _n')   // 3

互換性

  • YAYA: 初版より対応
  • AYA: 5.8以降
  • Tc574-6 / Tc602-9: 文の並び(; や改行で区切った複数の文や、if/for などの制御文)を実行できるようにした(それまでは式ひとつだけで、文の並びを渡すと解析に失敗して引数の文字列がそのまま返っていた)
  • Tc574-8 / Tc603-1: 渡すコードの中のヒアドキュメントを使えるようにした(それまではE0007になっていた)

関連項目