YAYASAORIとして使用するYAYA as SAORI について。

YAYA as SAORIを使うと、YAYAの持つ正規表現などの多数の関数やファイル・フォルダ操作が使用できるようになります。
里々の関数機能を大幅に拡張できると言えば分かりやすい。
里々では作る事が難しい処理をYAYA側で処理させるといった事も可能です。



使い方

  1. ここ(文屋)から YAYA as SAORIをダウンロードして解凍します。
  2. 解凍した yaya_saori フォルダから、ayasaori.aym, builtins.aym, yaya.dll, yaya.txt を、自ゴーストの saori フォルダへコピーします。
    なお aymファイルはテキストファイルなのでテキストエディタで編集できます。
  3. 自ゴーストの satori_conf.txt@saori 定義に下記の定義を追加します。
    aya,saori/yaya.dll
    よく使う関数は関数別に登録すると良いかもです、以下は定義例
    strstr,saori/yaya.dll,STRSTR

参考→postic AYA as SAORI向け簡易解説

YAYA最新版へ入れ換え

YAYA as SAORI に入っている YAYA 本体が古い場合は、必要に応じてここ (文屋)から落とした、yaya.dll を最新版と入れ替えます。

里々で使うにあたっての注意

里々の文法との相性などが理由で、予期せぬ動作の原因となる事があるので注意してください。

FREAD関数

バグ、と言う訳ではありませんが里々では全角丸括弧など特殊記号として扱われる文字が関数の返り値として帰ってくると里々が更に括弧展開してしまいます。
これを防ぐために関数の帰り値としてではなく、配列戻り値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
	}

参考→文wiki「文屋」 FREAD関数

FENUM関数

ファイル名にはカンマ類はすべて使用可能なため区切り文字はバイト値1等にした方が良いです。
※ファイル名に(1)のような全角丸括弧数字入りとか入っていた場合は里々が括弧展開してしまうので、FREAD関数の改造例を参考にして配列戻り値で値を返すように改造して問題回避出来ます。

参考→文wiki「文屋」 FENUM関数

ユーザー関数

ユーザー関数の作り方

  • ユーザー関数は関数を builtins.aym に追記するか、任意の aym ファイルを作成して yaya.txt に読み込む辞書として作成した aym ファイルを追加定義します。
    aym ファイルはテキストファイルですのでメモ帳等で編集できます。
  • 里々から saori の呼び出し時に渡した引数は、ユーザ関数内でREQ.ARGS[0], REQ.ARGS[1]...で取得します。
  • 関数戻り値は RES.RESULT に値を代入します、配列戻り値(※里々では(S0)などで受け取るもの)は RES.VALUE0, RES.VALUE1... に値を代入します。

参考
文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で複数ファイルドロップ時のファイルのソートとか…

里々文字列変換

里々でユーザー入力やファイル読み込み等で外部から文字列を取得すると、文字列内に(){全角丸括弧}や {全角シャープ}が入っている可能性があります。
()は文字列処理するために関数を通すと括弧展開されてしまいます。
は変数に入れてセーブデータとして保存すると次回ゴースト起動時のセーブデータ読出時にコメントとして機能してしまいます。
参考→困ったときの対処法

上記問題を次の二つの関数を使用する事で回避します。

  • satoristrenc関数:"(", ")", "#"をバイト値3+半角文字に変換します。変換後の文字列は文字列処理系関数で処理したりセーブデータに保存したりしても問題が無い様になります。(なおバイト値は3でなくても構いません引数区切りで使用してない値にして下さい)
  • satoristrdec関数:バイト値3+半角文字を全角文字に戻します、返り値は関数戻り値は空で配列戻り値(S0)で返します。表示する時やファイル処理系関数に渡す時に使用します。
// 文字列中の全角丸括弧及び全角#がある場合バイト値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

関連外部リンク


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-04-27 (金) 22:11:30 (147d)