YAYAをSAORIとして使用するYAYA as SAORI について。
YAYA as SAORIを使うと、YAYAの持つ正規表現などの多数の関数やファイル・フォルダ操作が使用できるようになります。
里々の関数機能を大幅に拡張できると言えば分かりやすい。
里々では作る事が難しい処理をYAYA側で処理させるといった事も可能です。
aya,saori/yaya.dllよく使う関数は関数別に登録すると良いかもです、以下は定義例
strstr,saori/yaya.dll,STRSTR
参考→postic AYA as SAORI向け簡易解説
YAYA as SAORI に入っている YAYA 本体が古い場合は、必要に応じて、yaya.dll を最新版と入れ替えます。
里々の文法との相性などが理由で、予期せぬ動作の原因となる事があるので注意してください。
バグ、と言う訳ではありませんが里々では全角丸括弧など特殊記号として扱われる文字が関数の返り値として帰ってくると里々が更に括弧展開してしまいます。
これを防ぐために関数の帰り値としてではなく、配列戻り値S0として返すとそれ以上括弧展開が行われないので builtins.aym の 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
}
ファイル名にはカンマ類はすべて使用可能なため区切り文字はバイト値1等にした方が良いです。
※ファイル名に(1)のような全角丸括弧数字入りとか入っていた場合は里々が括弧展開してしまうので、FREAD関数の改造例を参考にして配列戻り値で値を返すように改造して問題回避出来ます。
参考
文wiki「文屋」 YAYA as SAORI YAYA as SAORIの配布場所、解説等。
文wiki「文屋」 里々からYAYAへ移行する YAYAと里々の文法の違いがまとまっています。
文字列比較するだけの関数、compareが大文字小文字・全角半角を無視し、里々の比較演算子による文字列比較が比較文字列中に演算子や演算子の欠片があると意図しない比較やエラーになる問題の回避用
追記:問題回避にはequalが追加されたのでそちらを使って下さい、ここは簡単なユーザー関数のサンプルとして残します。
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イベントで下記の様にするとゴースト終了時に指定変数を削除出来ます。
例では頭文字がアンダーバーの変数を削除しています。(YAYAのローカル変数の命名規則的に。全然ローカルじゃないですけど)
*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区切りの文字列をソートして返します、クイックソートアルゴリズム使用。
追記:yayaにASORT関数が追加されたのでそちらを使ったほうがいいですが、こういう事も出来るというサンプルとして残しておきます。
YAYA as SAORI 側に追加するユーザー関数
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)+"#","#")
}
使用例
ファイル名に(1)などを含むファイルをドラッグ&ドロップします。
satoristrenc関数で変換してからreplace関数を通せば全角丸括弧ではないのでreplace関数の返り値は括弧展開されません。
全角丸括弧に戻す時はsatoristrdec関数を実行、関数返り値は何も入っていないので、配列返し値(S0)を使用します、(S0)に入ってる全角丸括弧は展開されません。
*OnFileDrop2 $,【タブ】(バイト値,2) $引数区切り追加【タブ】(,) $FileName1【タブ】(aya(,)satoristrenc(,)(R0)) $FileName2【タブ】(replace(,)(FileName1)(,)\(,)/) :\_q\_!(R0)\_! \_!(FileName1)\_! \_!(aya(,)satoristrdec(,)(FileName1))(S0)\_! \_!(aya(,)satoristrdec(,)(FileName2))(S0)\_! \_q