YAYAをSAORIとして使用するYAYA as SAORI について。 YAYA as SAORIを使うと、YAYAの持つ正規表現などの多数の関数やファイル・フォルダ操作が使用できるようになります。 使い方 †
参考→postic AYA as SAORI向け簡易解説 YAYA最新版へ入れ換え †YAYA as SAORI に入っている YAYA 本体が古い場合は、必要に応じてここ (文屋)から落とした、yaya.dll を最新版と入れ替えます。 里々で使うにあたっての注意 †里々の文法との相性などが理由で、予期せぬ動作の原因となる事があるので注意してください。 FREAD関数 †バグ、と言う訳ではありませんが里々では全角丸括弧など特殊記号として扱われる文字が関数の返り値として帰ってくると里々が更に括弧展開してしまいます。 if GETTYPE(_result) == 1 RES.VALUE0 = "EOF" else RES.RESULT = _result 改造後、里々側のファイルエンド検出の処理とか変える必要がます。 if GETTYPE(_result) == 1 RES.RESULT = 0 else { RES.RESULT = 1 RES.VALUE0 = _result } FENUM関数 †ファイル名にはカンマ類はすべて使用可能なため区切り文字はバイト値1等にした方が良いです。 ユーザー関数 †ユーザー関数の作り方 †
参考 文字列比較関数 †文字列比較するだけの関数、compareが大文字小文字・全角半角を無視し、里々の比較演算子による文字列比較が比較文字列中に演算子や演算子の欠片があると意図しない比較やエラーになる問題の回避用 compare { if ARRAYSIZE(REQ.ARGS) < 2 { LOGGING("compare: 引数が不足しています") -1 return } RES.RESULT = REQ.ARGS[0] == REQ.ARGS[1] } 里々側使用例 * :(aya,compare,==,==) 里々変数名列挙関数 †里々で使用している変数名を列挙する関数 // 里々のsatori_savedata.txtから変数名リストを取得、 // この関数を実行する前に里々側で$手動セーブ【タブ】実行をする事 // 返り値は変数の数、S0以降に変数名を格納 GetSatoriVarList { _FileName = '..\satori_savedata.txt' _i = 0 _charset = 'Shift_JIS' FCHARSET(_charset) if !FOPEN(_FileName, 'r') { RES.RESULT = -1 return } while 1 { if (_s = FREAD(_FileName)) == -1; break // 先頭行は"*セーブデータ"なので飛ばす($が見つからないで判断) // 2行目以降は先頭1文字($)を削る _n = STRSTR(_s,'$',0) if _n == -1 { continue } else { _s = SUBSTR(_s,1,STRLEN(_s) -1) } // 変数の値(TAB以降)を削る _n = STRSTR(_s,CHR(0x09),0) if _n > 0 { _s = SUBSTR(_s,0,_n) } // 格納 LETTONAME("RES.VALUE%(_i)", _s) _i++ } FCLOSE(_FileName) RES.RESULT = _i -1 } 里々側のOnDestroyイベントで下記の様にするとゴースト終了時に指定変数を削除出来ます。 *OnDestroy $手動セーブ【タブ】実行 $,【タブ】(バイト値,1) \0(nop,(aya,GetSatoriVarList))(for、0、(Sの数)-1、(call,fncVarClear,(C0))) $,【タブ】 #変数名の頭文字が_アンダーバーなら削除 *fncVarClear >fncVarClear.exit【タブ】(compare_head(,)(S(A0))(,)_)==0 $(S(A0))【タブ】 *fncVarClear.exit ソート関数 †バイト値1区切りの文字列をソートして返します、クイックソートアルゴリズム使用。 sort { if ARRAYSIZE(REQ.ARGS) < 1 { LOGGING("Sort: 引数が不足しています") -1 return } arX = SPLIT(REQ.ARGS[0],CHR(0x01)) _x = quicksort(0,ARRAYSIZE(arX)-1) _s = "" for _i = 0; _i < ARRAYSIZE(arX); _i++ { if (_i > 0) { _s = _s + CHR(0x01) } _s = _s + arX[_i] } RES.RESULT =_s ERASEVAR("arX") } quicksort { _first = _argv[0] _last = _argv[1] if (_first == _last) { return } _p = pivot(_first,_last) if (_p != -1) { _k = partition(_first,_last,arX[_p]) quicksort(_first,_k-1) quicksort(_k,_last) } } pivot { _i = _argv[0] _j = _argv[1] _k = _i + 1 while (_k <= _j && arX[_i] == arX[_k]) { _k++ } if (_k > _j) { -1 return } if (arX[_i] >= arX[_k]) { _i } else { _k } } partition { _i = _argv[0] _j = _argv[1] _x = _argv[2] _l = _i _r = _j while (_l <= _r) { while (_l <= _j && arX[_l] < _x) { _l++ } while (_r >= _i && arX[_r] >= _x) { _r-- } if (_l > _r) { break } _t = arX[_l] arX[_l] = arX[_r] arX[_r] = _t _l++ _r-- } _l return } 里々側で使う時の書式 (aya,sort,[バイト値1区切りの文字列]) 使用例 * $s【タブ】C(バイト値,1)Z(バイト値,1)E2(バイト値,1)A0(バイト値,1)00(バ イト値,1)E1 :\_qデータ:(s) 結 果:(aya,sort,(s))\_q\x 使い所はOnFileDrop2で複数ファイルドロップ時のファイルのソートとか… 里々文字列変換 †里々でユーザー入力やファイル読み込み等で外部から文字列を取得すると、文字列内に(){全角丸括弧}や# {全角シャープ}が入っている可能性があります。
// 文字列中の全角丸括弧及び全角#がある場合バイト値3+半角文字に変換 satoristrenc { if ARRAYSIZE(REQ.ARGS) < 1 { LOGGING("satoristrenc: 引数が不足しています") -1 return } RES.RESULT = REPLACE(REPLACE(REPLACE(REQ.ARGS[0],"(",CHR(0x03)+"("),")",CHR(0x03)+")"),"#",CHR(0x03)+"#") } // 文字列中のバイト値3+"(" or ")" or "#"を全角文字に変換する // そのまま関数返り値で返すと里々が括弧展開するので配列戻り値S0で返す satoristrdec { if ARRAYSIZE(REQ.ARGS) < 1 { LOGGING("satoristrdec: 引数が不足しています") -1 return } RES.RESULT = "" RES.VALUE0 = REPLACE(REPLACE(REPLACE(REQ.ARGS[0],CHR(0x03)+"(","("),CHR(0x03)+")",")"),CHR(0x03)+"#","#") } 使用例 *OnFileDrop2 $,【タブ】(バイト値,2) $引数区切り追加【タブ】(,) $FileName1【タブ】(aya(,)satoristrenc(,)(R0)) $FileName2【タブ】(replace(,)(FileName1)(,)\(,)/) :\_q\_!(R0)\_! \_!(FileName1)\_! \_!(aya(,)satoristrdec(,)(FileName1))(S0)\_! \_!(aya(,)satoristrdec(,)(FileName2))(S0)\_! \_q 関連外部リンク †
|