メタ操作・特殊関数†
33 個の関数。
- EVAL
- ISEVALUABLE
- ERASEVAR
- LETTONAME
- LSO
- SAVEVAR
- RESTOREVAR
- SERIALIZEVAR
- DESERIALIZEVAR
- GETSETTING
- SETSETTING
- GETFUNCLIST
- GETFUNCINFO
- GETVARLIST
- GETSYSTEMFUNCLIST
- CHARSETTEXTTOID
- CHARSETIDTOTEXT
- EXECUTE
- EXECUTE_WAIT
- EXECUTE_CAPTURE
- LICENSE
- APPEND_RUNTIME_DIC
- OUTPUTNUM
- DICLOAD
- DICUNLOAD
- FUNCDECL_ERASE
- FUNCDECL_READ
- FUNCDECL_WRITE
- UNDEFFUNC
- ISGLOBALDEFINE
- PROCESSGLOBALDEFINE
- SETGLOBALDEFINE
- UNDEFGLOBALDEFINE
EVAL†
書式†
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 を使います。
制御構造を含むコードの実行だけなら APPEND_RUNTIME_DIC でもできますが、EVAL のほうが高速です。APPEND_RUNTIME_DIC は関数テーブルへの登録を伴うのに対し、EVAL は実行用のブロックをひとつ作って実行するだけで済むためです。
クォートの中の ; { } や改行は区切りとして扱いません。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になっていた)
関連項目†
- ISEVALUABLE
- APPEND_RUNTIME_DIC
- シェルモード(辞書が無いとき、requestの入力を EVAL して返す)
ISEVALUABLE†
書式†
ISEVALUABLE( string )
引数†
| Parameter | Description |
|---|---|
| string | YAYAスクリプトとして実行する文字列 |
戻り値†
- 1: 文字列をEVALで評価・実行できる(構文的に正しい)
- 0: 文字列を評価できない(検証失敗)
解説†
指定した文字列をYAYAスクリプトとしてEVAL関数で実行できるかどうかを検証する関数。
EVALで任意の文字列を実行する前にこの関数で事前検証することで、不正なコード文字列による実行時エラーを防ぐことができる。
文の並び(; や改行で区切った複数の文や、if/for などの制御文)も、EVALと同じ規則で判定して検証する(Tc574-6 / Tc602-9以降)。
ISEVALUABLE('1 + 2') // 1
ISEVALUABLE('_a = 1; if _a { 2 }') // 1
ISEVALUABLE('_a = 1; if { 2') // 0
互換性†
- YAYA: Tc562-1以降
- Tc574-6 / Tc602-9: EVALが文の並びを実行できるようになったのに合わせて、文の並びも検証できるようにした
関連項目†
ERASEVAR†
書式†
ERASEVAR( name [, name ...] )
引数†
| Parameter | Description |
|---|---|
| name | 削除する変数名(文字列で指定)。複数指定可能。 |
戻り値†
返り値はありません(VOID)。
解説†
変数を消去します。変数名は文字列として指定する必要があります。
ERASEVAR("i") // 正しい例:変数 i を削除
ERASEVAR("i","j","k") // 正しい例:複数の変数を一度に削除
ERASEVAR(i) // 誤った例:変数名は文字列リテラルで指定すること
セーブデータに残す必要のないグローバル変数の消去などに利用できます。
互換性†
- YAYA: 初版より対応
- TC532-1以降: 複数変数の同時削除に対応
- AYA: 5.8以降
関連項目†
LETTONAME†
書式†
LETTONAME(name, val)
引数†
| Parameter | Description |
|---|---|
| name | 代入先の変数名を表す文字列 |
| val | 代入する値 |
戻り値†
VOID(戻り値なし)
解説†
nameで指定された文字列の変数名に、valで指定された値を代入します。実行時に変数名を動的に決定して値を代入する際に使用します。変数名を実行時に合成したい場合などに用います(例: shiori3.dic の reference 変数など)。
使用例†
// ループを使った動的変数代入
for _i = 0 ; _i < 5 ; _i ++ {
LETTONAME('var' + _i , _i + 100)
}
// var0〜var4にそれぞれ100〜104が代入される
// 配列の代入(正しい書き方)
LETTONAME(_varname, ('abc', 12))
// 配列変数を経由した代入(正しい書き方)
_array = ('abc', 12)
LETTONAME(_varname, _array)
// 誤った書き方(最初の値しか代入されない)
LETTONAME(_varname, 'abc', 12)
互換性†
- YAYA: 初期バージョンより使用可能
- AYA: バージョン5.8以降で使用可能
関連項目†
LSO†
書式†
LSO
LSO()
引数†
なし
戻り値†
直前のセレクション操作で選択された位置を示す数値。
解説†
"last Selection Order" の略。最後に行われた選択の結果を、位置を表す数値で返す。
request
{
_i = foo
LSO
}
foo
{
"earth"
"moon"
"sun"
}
_i に "sun" が代入された場合、LSO は 2 になる(0 始まり)。とにかく択一がされる場合すべてについて動作する。したがって、該当の処理が完了した直後に値を取得しないと意味がない。
取得する位置に注意†
次のコードは、ANY の選択結果を得ようとしているなら誤り。この位置にある LSO は、{ } の選択結果を取得する。したがって res は常に 0 になる。
request
{
{
"This is a " + ANY("pen", "pencil", "eraser") + "."
}
res = LSO
}
次のように修正すると、意図どおりに動作する。
request
{
{
"This is a " + ANY("pen", "pencil", "eraser") + "."
res = LSO
}
}
出力確定子がある場合†
出力確定子(--)がある場合、LSO はすべての取り得る組み合わせに対して動作する。
request
{
{
"1"
"2"
"3"
--
"A"
"B"
}
_i = LSO
}
たとえば上の関数内の { } 部は、"1A" "2A" "3A" "1B" "2B" "3B" のいずれかを出力する。LSO の値の範囲もこれと一致し、0〜5 を取る。各値は上の並びと一致する。
互換性†
- YAYA: 初期バージョンより使用可能
- AYA: バージョン5.8以降で使用可能
関連項目†
SAVEVAR†
書式†
SAVEVAR( [path] )
引数†
| Parameter | Description |
|---|---|
| path | 保存先ファイル名(省略時はDLL名 + "_variable.cfg"、例: yaya_variable.cfg) |
戻り値†
なし(VOID)
解説†
変数を保存します。unload時に行われる処理と同等です。
保存先ファイルを任意のパスに指定することもできます。
保存形式†
1行に1変数を、次の形式で書き出します。
変数名,値,"デリミタ",watcher|setter|destorier
値の書式は次のとおりです。
| 型 | 書式 | 例 |
|---|---|---|
| 整数 | そのまま | 5 |
| 実数 | 元の値に戻せる桁数の小数(指数は使わない)。無限大と NaN は inf -inf nan(Tc574-8 / Tc603-1以降) |
2.5、0.0000001 |
| 文字列 | "..."(" と制御文字はエスケープ) |
"abc" |
| 汎用配列 | 要素を : で区切る。要素が1つなら末尾に :IARRAY、空なら IARRAY:IARRAY |
1:"b":2.5 |
| ハッシュ(Tc600-3以降) | キー=値 を : で区切る。要素が1つなら末尾に :IHASH=IHASH、空なら IHASH=IHASH:IHASH=IHASH |
"a"=1:"b"="x" |
| 要素・キー・値の VOID | IVOID |
"v"=IVOID |
| 入れ子の要素(Tc600-3以降) | 配列・ハッシュの書式を IARRAY{...} / IHASH{...} で囲む |
"l"=IARRAY{1:2} |
Tc600-3以降のハッシュや入れ子の例:
h,"a"=1:"l"=IARRAY{1:2}:"n"=IHASH{"x"=1:"y"="s"},",",
v,IHASH{"k"=1:IHASH=IHASH}:IARRAY,",",
e,"e"=IHASH{IHASH=IHASH:IHASH=IHASH}:"ea"=IARRAY{IARRAY:IARRAY},",",
入れ子の内側も同じ規則で書き出すので、何段入れ子にしても元の値に戻せます。
ハッシュや入れ子を含まない変数の書式は、Tc600-3 より前と同じです。Tc600-3以降で保存したファイルを古いバージョンで読むと、ハッシュや入れ子を含む変数だけが崩れます(600 での変更点)。
互換性†
- YAYA: 初期バージョンより対応
- AYA: 5.8以降
- Tc600-3: ハッシュと入れ子の値の保存に対応
- Tc574-8 / Tc603-1: 実数を元の値に戻せる桁数で保存するようにした(それまでは小数6桁に丸めていて、無限大と NaN は読み戻せなかった)
関連項目†
RESTOREVAR†
書式†
RESTOREVAR( [ path ] )
引数†
| Parameter | Description |
|---|---|
| path | (省略可)復元元のファイル名。省略時はデフォルトのファイル名(DLL名 + "_variable.cfg"、例: yaya_variable.cfg)が使用される |
戻り値†
VOID(戻り値なし)
解説†
変数を(ファイルから)ロード(復元)します。処理はロード時に行われる処理と同等です。指定したファイルから変数を復元できます。
ファイルの形式は SAVEVAR を参照してください。Tc600-3以降はハッシュと入れ子の値も復元できます。Tc600-3 より前のバージョンで保存したファイルもそのまま読めます。
互換性†
- YAYA: 初期リリースから使用可能
- Tc600-3: ハッシュと入れ子の値の復元に対応
関連項目†
SERIALIZEVAR†
書式†
SERIALIZEVAR( name )
引数†
| Parameter | Description |
|---|---|
| name | 変数名の文字列。_ で始まればローカル変数、それ以外はグローバル変数 |
戻り値†
変数の値を、セーブファイルの値と同じ書式にした文字列。
変数が存在しない、値が VOID、または ERASEVAR で消した変数のときは、警告 W0012 を出して VOID を返します。
解説†
指定した変数の値を、SAVEVAR がセーブファイルに書くのと同じ書式の文字列にします。DESERIALIZEVAR に渡すと、同じ値を別の変数に復元できます。
セーブファイルの 1 行は 変数名,値,"デリミタ",watcher|setter|destorier ですが、この関数が返すのは値の部分だけです。変数名、デリミタ、watcher / setter / destorier、文字コードの指定は含みません。
JSON と違い、整数と実数、整数のキーと文字列のキー、VOID と空文字列などの区別を保ちます。入れ子の配列・ハッシュも IARRAY{...} / IHASH{...} の形でそのまま書き出します。
返す文字列は 1 行で、改行などの制御文字はエスケープされます。
使用例†
a = 5
b = "x,y"
c = (1, "x", 2.5)
d = IHASH("k", 1)
SERIALIZEVAR("a") // 5
SERIALIZEVAR("b") // "x,y"(ダブルクォートを含む)
SERIALIZEVAR("c") // 1:"x":2.5
SERIALIZEVAR("d") // "k"=1:IHASH=IHASH
ローカル変数も指定できます。
_x = IARRAY
_x[0] = IHASH("k", 1)
_x[1] = "s"
_s = SERIALIZEVAR("_x") // IHASH{"k"=1:IHASH=IHASH}:"s"
互換性†
- Tc607-3以降
関連項目†
DESERIALIZEVAR†
書式†
DESERIALIZEVAR( name, text )
引数†
| Parameter | Description |
|---|---|
| name | 復元先の変数名の文字列。_ で始まればローカル変数、それ以外はグローバル変数。存在しなければ作る |
| text | SERIALIZEVAR が返す書式の文字列 |
戻り値†
復元できれば 1。text が書式として読めなかったときや、引数が不正なときは 0(変数には何もしません)。
解説†
text を、SAVEVAR がセーブファイルに書く値の書式として読み、name の変数に格納します。変数が元から持っていた値は置き換わり、型も text の内容で決まります(整数 / 実数 / 文字列 / 配列 / ハッシュ)。
LETTONAME と同じく、変数に設定された setter / watcher は呼びません。デリミタや setter / watcher / destorier の設定は変えません。
次の場合は警告を出して 0 を返し、変数を作りも変えもしません。
| 場合 | 警告 |
|---|---|
| 引数が足りない | W0008 |
name か text が文字列でない |
W0009 |
name が空文字列 |
W0010 |
name が変数名として使えない(, を含む、システム関数や予約語と同名など) |
W0012 |
text が書式として読めない(空文字列、ダブルクォートのない文字列、: のない配列、IVOID だけの値など) |
W0026 |
使用例†
a = (1, "x", 2.5)
_s = SERIALIZEVAR("a")
_r = DESERIALIZEVAR("b", _s) // b が (1, "x", 2.5) になる。_r は 1
DESERIALIZEVAR("n", "0.5") // n が実数 0.5 になる
DESERIALIZEVAR("m", "abc") // 0。警告 W0026
ローカル変数への復元:
_x = IARRAY
_x[0] = IHASH("k", 1)
_x[1] = "s"
_r = DESERIALIZEVAR("_y", SERIALIZEVAR("_x"))
// _y は _x と同じ入れ子の配列になる
互換性†
- Tc607-3以降
関連項目†
GETSETTING†
書式†
GETSETTING( string )
引数†
| Parameter | Description |
|---|---|
| string | 取得したい情報の識別子(後述の文字列または基礎設定のエントリ名) |
戻り値†
- 成功: 要求した情報(文字列)
- 失敗: 空文字列
解説†
動作中の文に設定されている情報を返す関数。
stringには以下の識別子(文字列)または後方互換のための数値(0〜4)を指定できる。また、基礎設定のエントリ名を指定することも可能。
取得できる情報†
| 識別子 | 旧数値 | 取得されるデータ | 例 |
|---|---|---|---|
coreinfo.version |
0 | YAYAのバージョン番号 | "Tc522-1" |
| (数値1) | 1 | 現在の文字コードID(0=Shift_JIS、1=UTF-8、127=OS のデフォルト) | 0 |
coreinfo.path |
2 | ディレクトリの絶対パス | "c:\hogehoge\" |
coreinfo.name |
3 | DLL名 | "YAYA" |
coreinfo.author |
4 | DLL作者 | "umeici/The Maintenance Shop" |
coreinfo.savefile |
— | セーブファイルのパス | "d:/ghost/konno_yayame/..." |
coreinfo.mode |
— | 実行モード | "normal" または "emergency" |
coreinfo.locale |
— | OSのユーザー設定の地域(数値や日付の書式)のロケール | "ja-JP" |
coreinfo.uilocale |
— | OSのユーザー設定の表示言語のロケール | "ja-JP" |
coreinfo.timezone |
— | OSのローカルタイムゾーンのIANAの名前 | "Asia/Tokyo" |
coreinfo.locale / coreinfo.uilocale は 言語-地域 の形式(BCP 47)の名前を返す。取得できないときは空文字列になる。
- Windows: ユーザーの既定のロケール名(
coreinfo.uilocaleは表示言語) - Linux / macOS: 環境変数から求める。
coreinfo.localeはLC_ALL→LC_NUMERIC→LANG、coreinfo.uilocaleはLANGUAGE(先頭の言語)→LC_ALL→LC_MESSAGES→LANGの順に最初に設定されているもの。ja_JP.UTF-8はja-JPにする。C/POSIXや未設定は空文字列 - 返した名前は TOUPPER / TOLOWER のロケール引数にそのまま渡せる
coreinfo.timezone は Asia/Tokyo のようなIANAのタイムゾーン名を返す。取得できないときは空文字列になる。
- Windows: OSのタイムゾーン名をICU(
icu.dll、Windows 10 1903 以降)で変換する。それより古いWindowsでは空文字列 - Linux / macOS: 環境変数
TZ、無ければ/etc/localtimeのリンク先、それも無ければ/etc/timezone。TZがJST-9のようなPOSIX形式のときは、その文字列がそのまま返る - 夏時間やオフセットを含めた情報は GETTIMEZONE で取れる
互換性†
- YAYA: 初期バージョンから使用可能。
coreinfo.modeはTc556-2で、coreinfo.locale/coreinfo.uilocale/coreinfo.timezoneはTc606-1で追加 - AYA: バージョン5.8以降(数値引数0〜4のみ対応)
関連項目†
SETSETTING†
書式†
SETSETTING( name , string )
引数†
| Parameter | Description |
|---|---|
| name | 設定情報のエントリ名(文字列)。基本設定ファイルのエントリ名を指定 |
| string | 設定する値(文字列) |
戻り値†
- 1: 成功
- 0: 失敗
解説†
動作中の文の設定情報を変更します。GETSETTING と対になる関数です。
以下の設定エントリは初回ロード時にのみ意味を持つため、実行時に変更しても効果がありません:
- dic
- msglang
- charset.dic
- checkparser
互換性†
- YAYA: 初期バージョンより対応
関連項目†
GETFUNCLIST†
書式†
GETFUNCLIST( [prefix] )
引数†
| Parameter | Description |
|---|---|
| prefix | (省略可)この文字列で始まる関数名のみを返す。省略した場合はすべての関数を返す |
戻り値†
- 成功: 関数名の汎用配列
- 失敗: IARRAY
解説†
現在読み込んでいる辞書の関数一覧を返す関数。
prefixを指定すると、その文字列で始まる関数名のみがフィルタリングされて返される。省略した場合はすべての関数が返される。
使用例†
指定した名前で始まる関数をすべて実行する関数と、正規表現にマッチする関数をすべて実行する関数の例。
CALLALLFUNCTIONBEGINAS {
_L= GETFUNCLIST(_argv[0])
foreach _L;_V {
EVAL(_V)
}
}
CALLALLFUNCTIONINRE {
_L= GETFUNCLIST
foreach _L;_V {
if RE_GREP(_V,_argv[0])
EVAL(_V)
}
}
互換性†
- YAYA: 初期から利用可能
関連項目†
GETFUNCINFO†
書式†
GETFUNCINFO( name )
引数†
| Parameter | Description |
|---|---|
| name | 情報を取得したい関数名(必須) |
戻り値†
- 成功: 汎用配列
- インデックス0: 関数が定義されているファイルのフルパス
- インデックス1: 開始行番号
- インデックス2: 終了行番号
- 失敗: -1
解説†
現在読み込んでいる辞書の(ユーザー)関数の情報を取得する関数。
関数が定義されているファイルのパスと、その開始・終了行番号を取得できる。デバッグ用途で、ある関数がどのファイルのどこに定義されているかを動的に調べる際に有用。
使用例†
OnTextDrop で関数名を受け取り、その関数が定義されているファイルと行を表示する例(デバッグモード時)。
OnTextDrop{
//...
if DebugMode{
_t=CUTSPACE(reference0)
//...
if ISFUNC(_t){
_info=GETFUNCINFO(_t)
_path=SPLITPATH(_info[0])
if _path
_path=_path[2]+_path[3]
else
_path=_info[0]
"関数「%(_t)」は、\n/
ファイル「\q[◇%(_path),OnOpenDirOrFile,%(_info[0])]」の%(_info[1])行目から始まります。\n/
"
}
//...
}
//...
}
互換性†
- YAYA: Tc558-1 以降
関連項目†
GETVARLIST†
書式†
GETVARLIST( [ prefix ] )
引数†
| Parameter | Description |
|---|---|
| prefix | (省略可)指定した文字列で始まる変数名のみを返す。省略時は全変数を返す |
戻り値†
- 成功時: 変数名の汎用配列
- 失敗時: IARRAY
解説†
現在保持している変数のリストを返す。prefix を指定すると、その文字列で始まる変数名のみが返される。
使用例†
指定した名前で始まる変数をすべて消去する関数と、正規表現にマッチする変数をすべて消去する関数の例。
ERASEALLVARBEGINAS {
_L= GETVARLIST(_argv[0])
foreach _L;_V {
ERASEVAR(_V)
}
}
ERASEALLVARINRE {
_L= GETVARLIST
foreach _L;_V {
if RE_GREP(_V,_argv[0])
ERASEVAR(_V)
}
}
互換性†
- YAYA: 初期から利用可能
関連項目†
GETSYSTEMFUNCLIST†
書式†
GETSYSTEMFUNCLIST( [ prefix ] )
引数†
| Parameter | Description |
|---|---|
| prefix | (省略可)指定した文字列で始まるシステム関数名のみを返す。省略時は全システム関数を返す |
戻り値†
- 成功時: システム関数名の汎用配列
- 失敗時: IARRAY
解説†
システム関数のリストを返す。prefix を指定すると、その文字列で始まるシステム関数名のみが返される。省略した場合は全システム関数のリストが返される。
互換性†
- YAYA: Tc557-1以降
関連項目†
CHARSETTEXTTOID†
書式†
CHARSETTEXTTOID(string)
引数†
| Parameter | Description |
|---|---|
| string | 文字コードを表す文字列 |
戻り値†
成功時:文字コードIDを表す整数 失敗時:-1(警告 W0012、GETLASTERROR は 12)
文字コードを表す文字列を文字コードIDに変換する。使える名前は 文字コードの名前 を参照。大文字小文字は区別しない。空文字列は 127(OSデフォルト)になる。
使用例†
CHARSETTEXTTOID('Shift_JIS') // 0 を返す
CHARSETTEXTTOID('UTF-8') // 1 を返す
CHARSETTEXTTOID('UTF8') // 1 を返す
CHARSETTEXTTOID('UTF-16') // -1 を返す(W0012)
互換性†
- YAYA: 初版から利用可能
- Tc574-8 / Tc603-1: 知らない名前のときに、127 ではなく -1 を返して警告 W0012 を出すようにした
関連項目†
CHARSETIDTOTEXT†
書式†
CHARSETIDTOTEXT(id)
引数†
| Parameter | Description |
|---|---|
| id | 文字コードIDを表す整数 |
戻り値†
成功時:文字コードを表す文字列 失敗時:"default" という文字列
解説†
文字コード ID を、文字コードを表す文字列に変換する。
使用例†
CHARSETIDTOTEXT(0) // "Shift_JIS" を返す
CHARSETIDTOTEXT(1) // "UTF-8" を返す
互換性†
- YAYA: 初版から利用可能
関連項目†
EXECUTE†
書式†
EXECUTE( path [, option [, dir ]] )
引数†
| Parameter | Description |
|---|---|
| path | 起動するファイルまたはアプリケーションのパス。相対パスは信頼性が低いため、絶対パスの使用を推奨。 |
| option | アプリケーションに渡す引数(省略可)。URLをブラウザで開く場合などに使用。 |
| dir | 起動するプロセスの作業ディレクトリ(省略可)。相対パスは FOPEN などと同じく DLL のロードディレクトリを基準とする。省略するか空文字列なら指定しない。YAYA や SSP のカレントディレクトリは変わらない。 |
戻り値†
- 成功時: 0以上の整数(OS依存。Windows では ShellExecute の返値、POSIX 環境では 0)
- 失敗時: -1(dir が存在しないディレクトリの場合も含む)
解説†
コマンド文字列をコマンドプロセッサに引き渡して外部アプリケーションやファイルを起動します。C言語の system() 関数を改良したもので、アプリケーションの終了を待たずに処理を返します。
使用例†
_val = EXECUTE('IEXPLORE.EXE','http://www.yahoo.co.jp/')
Yahoo のホームページを Internet Explorer で開きます。
互換性†
- YAYA: 初版より対応
- Tc604-1: 第3引数 dir(作業ディレクトリ)を追加。POSIX 環境に対応した(以前は常に -1 を返していた)
関連項目†
EXECUTE_WAIT†
書式†
EXECUTE_WAIT( path [, option [, dir ]] )
引数†
| Parameter | Description |
|---|---|
| path | 実行するファイルまたはアプリケーションのパス。相対パスは信頼性が低いため、絶対パスの使用を推奨。 |
| option | アプリケーションに渡す引数(省略可)。URLをブラウザで開く場合などに使用。 |
| dir | 起動するプロセスの作業ディレクトリ(省略可)。相対パスは FOPEN などと同じく DLL のロードディレクトリを基準とする。省略するか空文字列なら指定しない。YAYA や SSP のカレントディレクトリは変わらない。 |
戻り値†
- 成功時: 実行したプロセスの終了コード。起動済みのアプリケーションに処理を渡した場合など、待つプロセスがなければ 0
- 失敗時: -1(dir が存在しないディレクトリの場合や、POSIX 環境でシグナルにより終了した場合も含む)
解説†
コマンド文字列をOSのコマンドプロセッサに引き渡して外部アプリケーションやファイルを実行します。EXECUTE と異なり、アプリケーションの終了を待ってから処理を返します(同期実行)。C言語の system() 関数に相当します。
使用例†
_val = EXECUTE_WAIT('CL.EXE','HELLOWORLD.C')
C コンパイラで HELLOWORLD.C をコンパイルし、完了を待ちます。
THREADSTART で起動したスレッドから呼ぶと、外部アプリケーションの終了を待つ間も、SSP からの request や他のスレッドが止まりません。Windows では、スレッドが THREADSTOP や unload で中断を求められると、待つのをやめて -1 を返します(起動したアプリケーションはそのまま動き続けます)。POSIX では、終わるまで待ちます。
互換性†
- YAYA: TC532-1以降
- Tc604-1: 第3引数 dir(作業ディレクトリ)を追加。返値を終了コードにした(以前は Windows では成功時に 1、POSIX 環境では system() の返値をそのまま返していた)
- Tc608-1: 待つ間にほかのスレッドが動けるようにした(
THREADSTARTのスレッドがあるとき)
関連項目†
- EXECUTE
- EXECUTE_CAPTURE(標準出力・標準エラー出力を取り込む。標準入力も渡せる)
- THREADSTART
EXECUTE_CAPTURE†
書式†
EXECUTE_CAPTURE( path [, option [, dir [, options ]]] )
引数†
| Parameter | Description |
|---|---|
| path | 実行するファイルのパス。EXECUTE_WAIT と同じく、相対パスは信頼性が低いため、絶対パスの使用を推奨。PATH にあるコマンド名も指定できる |
| option | プログラムに渡す引数(省略可)。EXECUTE_WAIT と同じ |
| dir | 起動するプロセスの作業ディレクトリ(省略可)。EXECUTE_WAIT と同じ。省略するか空文字列なら指定しない |
| options | 動作を指定するハッシュ(省略可)。IHASH で作る。下の表のキーを使う。キーを省いたものは既定の動作になる |
options のキー†
| キー | 値 | 意味 |
|---|---|---|
| stdin | 文字列 | プログラムの標準入力に渡す内容。省略すると、何も渡さずにすぐ入力の終わりになる(入力を待ち続けるプログラムも止まらない) |
| stderr | "separate" / "merge" / "discard" |
標準エラー出力の扱い。"separate"(既定)は標準出力とは別に取り込む。"merge" は標準出力に混ぜる(出力された順のまま stdout に入り、stderr は空)。"discard" は捨てる |
| timeout | 整数(ミリ秒) | この時間で終わらなければ、プログラムを終了させて戻る。0(既定)は無制限 |
| maxsize | 整数(バイト) | stdout・stderr それぞれの上限。超えたらプログラムを終了させて戻る。既定は 16777216(16MiB)、指定できる最大は 1073741824 |
| charset | 文字コードの名前または数値 | stdin の文字列を渡すとき、stdout・stderr を文字列にするときの文字コード(文字コードの名前)。省略または空文字列なら OS の既定(Windows は ANSI コードページ、POSIX は UTF-8)。path・option・dir には影響しない |
値が VOID のキーは、指定していないものとして扱う。
戻り値†
次のキーを持つハッシュ。
| キー | 値 |
|---|---|
| exitcode | プログラムの終了コード。終了を確認できなかったとき("failed"、プログラムが終わる前の "timeout" / "canceled" / "truncated")は -1。POSIX 環境でシグナルにより終了したときも -1 |
| stdout | 標準出力の内容(文字列) |
| stderr | 標準エラー出力の内容(文字列)。stderr オプションが "merge" / "discard" のときは空 |
| status | 終わり方。下の表を参照 |
| status | 意味 |
|---|---|
| ok | プログラムが終了した(終了コードが 0 でなくても "ok") |
| timeout | timeout の時間で終わらなかったので終了させた |
| canceled | THREADSTOP や unload でスレッドの中断を求められたので終了させた |
| truncated | stdout か stderr が maxsize を超えたので終了させた。内容は maxsize までに切り詰める |
| failed | 起動できなかった(実行ファイルが見つからない、作業ディレクトリがない、など)。引数やオプションが不正なときも "failed" を返す |
timeout / canceled / truncated のときも、それまでに取り込んだ出力は stdout / stderr に入る。
解説†
外部のプログラムを起動し、終了を待って、標準出力・標準エラー出力を取り込みます。標準入力に文字列を渡すこともできます。ほかの言語の subprocess.run(Python)、Open3.capture3(Ruby)、execFileSync(Node.js)にあたる関数です。
_r = EXECUTE_CAPTURE('cmd.exe', '/c ver')
if _r['status'] == 'ok' && _r['exitcode'] == 0 {
_r['stdout']
}
標準入力に渡して、結果を受け取る例です。
_in = 'b' + CHR(13,10) + 'a' + CHR(13,10)
_r = EXECUTE_CAPTURE('sort.exe', '', '', IHASH('stdin', _in))
_r['stdout'] // "a" と "b" が並ぶ
標準エラー出力を標準出力に混ぜ、10 秒で打ち切る例です。
_r = EXECUTE_CAPTURE('tool.exe', '--run', '', IHASH('stderr', 'merge', 'timeout', 10000))
EXECUTE_WAIT との違い†
- シェルの関連付けは使いません。文書や URL を既定のアプリケーションで開くことはできません(それには EXECUTE_WAIT や EXECUTE を使います)。Windows は実行ファイルを直接起動し(
CreateProcess)、pathを"で囲んだものにoptionを続けたコマンドラインを渡します。.bat/.cmdも起動できますが、optionにスクリプトの外から来た文字列を混ぜないでください。POSIX は/bin/sh -cに渡します。実在するファイルは 1 つの名前として扱い、無ければシェルのコマンドとして PATH から探します - Windows ではコンソールの窓を開きません
- 標準出力・標準エラー出力はパイプで受け取るので、プログラムによっては、端末につながっているときと出力の仕方(バッファリングなど)が変わります
- 改行は変換しません。Windows のプログラムの出力は
CRLFのままです - 出力に NUL(
\0)が含まれていると、そこで文字列が終わります - 起動できなかったときは警告を出さず、
statusが"failed"のハッシュを返します
待っている間の動き†
- 待つ間は、THREADSTART のスレッドや SSP からの
requestが止まりません(EXECUTE_WAIT と同じ) - スレッドが THREADSTOP や unload で中断を求められると、プログラムを終了させてから
"canceled"で戻ります。EXECUTE_WAIT は Windows でも起動したプログラムをそのままにしますが、こちらは終了させます。POSIX でも中断できます - 終了させるとき、POSIX はプログラムが作ったプロセスグループごと(
sh -cが起動した子プロセスも)終了させます。Windows は起動したプロセスだけを終了させ、そのプロセスが起動した別のプロセスは終了させません - プログラムが終わった後に、別のプロセスが標準出力・標準エラー出力を握り続けていることがあります(
startや&で起動した常駐プログラムなど)。そのときは、出力が途切れてから 0.5 秒で読むのをやめ、"ok"で戻ります。そのプロセスが後から出力する分は取り込めません。出力が途切れずに続く間も、timeoutの時間がたつか中断を求められれば、"timeout"/"canceled"で戻ります(プログラム自身は終わっているので、exitcodeは返ります) - 標準入力への書き込みと、標準出力・標準エラー出力の読み出しは並行して行うので、大きな入力と大きな出力を同時に扱ってもプログラムと互いに待ち合うことはありません
エラー†
| 状況 | 警告 | GETLASTERROR |
|---|---|---|
| path がない | W0008 | 8 |
| path・dir・options・オプションの値の型が不正 | W0009 | 9 |
stderr / timeout / maxsize / charset の値が不正 |
W0012 | 12 |
stdin を指定の文字コードに変換できない |
W0027 | 27 |
| 出力を文字列にできない(その出力は空になる) | W0027 | 27 |
| options に知らないキーがある(つづりの間違いに気づけるよう警告する。ほかのキーは有効で、実行は続ける) | W0012 | 12 |
path などが不正で警告を出したときも、status が "failed" のハッシュを返します。
互換性†
- Tc608-3: 追加
関連項目†
LICENSE†
書式†
LICENSE()
LICENSE
引数†
なし
戻り値†
YAYAのライセンス文字列を格納した汎用配列。各エントリは改行で区切られる。
解説†
YAYAのライセンス文字列を返します。YAYA 本体に続けて、組み込んでいるライブラリ(MT19937、parson、TinyXML-2、SQLite)のライセンス文も含みます。
互換性†
- YAYA: Tc530-1以降で使用可能
- Tc601-1: parson と TinyXML-2 のライセンス文を追加した
- Tc602-11: SQLite(パブリックドメイン)の記載を追加した
関連項目†
APPEND_RUNTIME_DIC†
書式†
APPEND_RUNTIME_DIC(dic_content)
引数†
| Parameter | Description |
|---|---|
| dic_content | 辞書ファイルの内容と同等の文字列。複数行や関数定義を含むことができる |
戻り値†
成功時:0 失敗時:-1
解説†
_RUNTIME_DIC_ という辞書名のメモリ上の辞書に、dic_content の中身を書いたのと同じ効果をもたらす。動的に新たなユーザー関数の定義などができる。dic_content には複数行や関数定義を書け、ファイルから辞書を読んだのと同じ挙動になる。
THREADSTART で起動したスレッドが動いている間は、警告 W0032 を出して何も追加せず -1 を返す。
互換性†
- YAYA: Tc562-1 以降
- Tc608-1: ワーカースレッドが動いている間は追加できないようにした
関連項目†
OUTPUTNUM†
書式†
OUTPUTNUM(function_name)
引数†
| Parameter | Description |
|---|---|
| function_name | 調べる対象の関数名(文字列) |
戻り値†
対象関数が出力する選択候補数(整数)
解説†
指定した関数が出力する選択候補数を返します。対象関数を空の引数リストで呼び出すことで、出力候補数を取得します。関数の択一選択の仕組みについては関数の選択方式を参照してください。
互換性†
- YAYA: バージョンTc569-1以降で使用可能
関連項目†
DICLOAD†
書式†
DICLOAD( filename [, code] )
引数†
| Parameter | Description |
|---|---|
| filename | 読み込む辞書ファイル名 |
| code | 文字コードID、または文字コードの名前(文字コードの名前)。省略時、空文字列、default のときは基本設定ファイルの設定に従う。知らない名前なら警告 W0012 を出して何も読み込まずに 1 を返す |
戻り値†
0: 成功1: 失敗
解説†
指定した辞書ファイルを動的に読み込みます。
注意事項:
- 辞書に問題がある場合はエラーとなり、何も変更されません。
- 読み込んだ辞書は次のリクエスト呼び出しまで有効にならず、現在実行中の関数は保護されます。
- 文字列埋め込み要素の範囲付き展開は DICLOAD 後には機能しません。読み込んだ辞書の内容をすぐに認識できる EVAL の使用を検討してください。
- 読み込んだ辞書は DICUNLOAD で解除できますが、制限があります。
- THREADSTART で起動したスレッドが動いている間は、警告 W0032 を出して何も読み込まずに 1 を返します。
互換性†
- YAYA: Tc556-1以降
- Tc608-1: ワーカースレッドが動いている間は読み込めないようにした
- Tc574-8 / Tc603-1: 文字コードIDを数値で渡したときに無視されていたのを修正。知らない文字コードの名前を渡すと、警告 W0012 を出して失敗するようにした(それまでは基本設定ファイルの設定で読み込んでいた)
関連項目†
DICUNLOAD†
書式†
DICUNLOAD( filename )
引数†
| Parameter | Description |
|---|---|
| filename | アンロードする辞書ファイル名 |
戻り値†
0: 成功1: 失敗
解説†
指定した辞書ファイルに含まれる関数および globaldefine グループをアンロードします。辞書ファイルに問題がある場合はエラーとなり何も起こりません。他の辞書から使われている関数を含む辞書はアンロードできません。
THREADSTART で起動したスレッドが動いている間は、警告 W0032 を出して何もせず 1 を返します。
互換性†
- YAYA: Tc561-1以降
- Tc608-1: ワーカースレッドが動いている間はアンロードできないようにした
関連項目†
FUNCDECL_ERASE†
書式†
FUNCDECL_ERASE(variable_name, function_name)
引数†
| Parameter | Description |
|---|---|
| variable_name | 監視対象の変数名 |
| function_name | 変数削除時に実行する関数名。空文字列('' または "")を指定すると登録解除 |
戻り値†
- 成功時: 1
- 失敗時: 0
変数が削除されたとき、指定した関数が自動的に呼び出される。呼び出される関数の引数は以下の通り:
_argv[0]: 変数名_argv[1]: 変数の現在の値
呼び出された関数の戻り値はシステムによって無視される。
変数がまだ無いときは、空の変数を作ってから登録する。
互換性†
- YAYA: Tc565-1 以降
- Tc574-8 / Tc603-1: 変数がまだ無いときは作って登録するようにした(それまでは何もせず 0 を返していた)
関連項目†
FUNCDECL_READ†
書式†
FUNCDECL_READ(variable_name, function_name)
引数†
| Parameter | Description |
|---|---|
| variable_name | 監視対象の変数名 |
| function_name | 変数読み取り時に実行する関数名。空文字列('')を指定すると登録解除 |
戻り値†
- 成功時: 1
- 失敗時: 0
変数が読み取られるたびに、指定した関数が自動的に呼び出される。呼び出される関数の引数は以下の通り:
_argv[0]: 変数名_argv[1]: 変数の現在の値
呼び出された関数は、実際に取得する値を返す必要がある(現在の値と異なる値を返すことも可能)。
値が汎用配列やハッシュのときは、_argv[1] が入れ子の配列やハッシュになる(_argv の要素数は 2 のまま)。Tc600-3 より前は、配列の値の先頭要素だけが _argv[1] に入っていた。
変数がまだ無いときは、空の変数を作ってから登録する。
互換性†
- YAYA: Tc565-1 以降
- Tc600-3: 配列やハッシュの値を入れ子のまま渡すようにした
- Tc574-8 / Tc603-1: 変数がまだ無いときは作って登録するようにした(それまでは何もせず 0 を返していた)
関連項目†
FUNCDECL_WRITE†
書式†
FUNCDECL_WRITE(variable_name, function_name)
引数†
| Parameter | Description |
|---|---|
| variable_name | 監視対象の変数名 |
| function_name | 変数書き込み時に実行する関数名。空文字列("" または '')を指定すると登録解除 |
戻り値†
- 成功時: 1
- 失敗時: 0
指定した変数に書き込みが行われるたびに、登録した関数が自動的に呼び出される。呼び出される関数の引数は以下の通り:
_argv[0]: 変数名_argv[1]: 代入される新しい値(=の右辺)_argv[2]: 変数の以前の値
呼び出された関数は、変数に実際に書き込まれる値を返す必要がある(_argv[1] と異なる値を返すことも可能)。
値が汎用配列やハッシュのときは、_argv[1] _argv[2] の要素が入れ子の配列やハッシュになる(_argv の要素数は 3 のまま)。Tc600-3 より前は、配列の値が正しく渡らず(_argv[1] _argv[2] が空になる)、戻り値をそのまま返すと変数が空になっていた。
添字への代入(a[0] = v)では呼び出されない。
変数がまだ無いときは、空の変数を作ってから登録する(あとで代入したときに呼び出される)。
互換性†
- YAYA: Tc565-1 以降
- Tc574-8 / Tc603-1: 変数がまだ無いときは作って登録するようにした(それまでは何もせず 0 を返していた)
- Tc600-3: 配列やハッシュの値を入れ子のまま渡すようにした
関連項目†
UNDEFFUNC†
書式†
UNDEFFUNC( funcname )
引数†
| Parameter | Description |
|---|---|
| funcname | 読み込み解除する関数名 |
戻り値†
- 0: 成功
- 1: 失敗
解説†
指定した関数を読み込み解除する。
アンロードにより辞書ファイルに問題が生じる場合はエラーとなり、何も起こらない。また、既に他の箇所から参照されている関数はアンロードできない。
THREADSTART で起動したスレッドが動いている間は、警告 W0032 を出して何もせず 1 を返す。
互換性†
- YAYA: Tc561-1 以降
- Tc608-1: ワーカースレッドが動いている間は読み込み解除できないようにした
関連項目†
ISGLOBALDEFINE†
書式†
ISGLOBALDEFINE( define )
引数†
| Parameter | Description |
|---|---|
| define | #globaldefine で定義されているか確認する名前 |
戻り値†
- 1: 定義が存在する
- 0: 定義が存在しない
解説†
#globaldefine ディレクティブで定義された名前が存在するかどうかを確認する。
互換性†
- YAYA: Tc562-1以降
関連項目†
PROCESSGLOBALDEFINE†
書式†
PROCESSGLOBALDEFINE(string)
引数†
| Parameter | Description |
|---|---|
| string | プリプロセス処理を行いたい文字列 |
戻り値†
- 成功: グローバル定義を適用した後の処理済み文字列
- 失敗: -1
解説†
#globaldefine で定義したプリプロセス処理(文字列置き換え処理)と同様の処理を行います。プリプロセッサ機能の詳細については、プリプロセスを参照してください。
互換性†
- YAYA: バージョンTc559-1から使用可能
関連項目†
SETGLOBALDEFINE†
書式†
SETGLOBALDEFINE( define_name , define_value )
引数†
| Parameter | Description |
|---|---|
| define_name | #globaldefine で定義する名前 |
| define_value | #globaldefine で割り当てる値 |
戻り値†
- 1: 成功
- 0: 失敗
解説†
メモリ上の _RUNTIME_DIC_ という名前の辞書に #globaldefine を記述したのと同等の効果をもたらします。
互換性†
- YAYA: Tc562-1以降
関連項目†
UNDEFGLOBALDEFINE†
書式†
UNDEFGLOBALDEFINE( definename )
引数†
| Parameter | Description |
|---|---|
| definename | #globaldefine で宣言したディレクティブ名 |
戻り値†
- 0: 成功
- 1: 失敗
解説†
#globaldefine で宣言されたディレクティブを無効化・削除する。
#globaldefine で定義されたテキストを辞書ファイルに直接挿入することはできない。クォートで囲んでいてもプリプロセッサが適用されてしまうため、回避するには対象文字列を分割して記述する(例: "TEST_" + "DEF" のように連結する)。
互換性†
- YAYA: Tc561-1 以降