関数とはなんぞや。
それは、何かを入れると何かが返ってくるものです。
変数やトークを呼び出す時と同じように、かっこ()を使います。
大きく違うのは、「引数」と呼ばれるオプションがついていること。(ついていない時もある)
(関数名、引数1、引数2、....)
関数名が使いたい機能、引数が処理して欲しいもの...という感じ。
SAORIを使う時もこれと同じ仕組みです。
一般的な関数の書式では、
(関数名[,引数1,引数2,…引数n])
のように記述しますが、この関数名や引数をそれぞれ区切る文字を「引数区切り文字」と呼びます。
(上記書式では半角カンマ",")
引数区切り文字は標準で"," "," "、" "、" バイト値1が定義されています。
これらは追加または削除が可能です。→特殊変数-引数区切り追加・削除
引数の文字列に区切り文字と同じ記号が含まれていれば、区切り文字として機能します。
ただし、引数区切り文字が実際に機能するのは、最初に現れたもの一つだけ(らしい)です。従って、さくらスクリプトで使われる半角カンマなどが誤爆するのを防ぐ・引数区切り文字を文字列として使う場合…
#────区切り文字がさくらスクリプトでも使われていると意図通りの動作をしない (関数名,hoge,\q[ほげ,メメタァ]) #────区切り文字を半角コンマ以外に書き換える (関数名、hoge、\q[ほげ,メメタァ]) (関数名、hoge、\q[ほげ,メメタァ]) (関数名,hoge,\q[ほげ,メメタァ])
これで半角カンマをただの文字列として動作させられます。
例:(R0)の中に半角カンマが含まれエラーが出る場合
(split,(R0),(バイト値,1))
引数区切り文字を"、"に替えるとエラーを防げる
(split、(R0)、(バイト値,1))
引数の中に全ての区切り文字が含まれる可能性がある場合は一時的に引数内に含まれない文字を引数区切りとして設定する事でこの問題を回避します。参考:引数区切り追加・削除
例えばファイル名にはカンマ類の文字は全て含まれる可能性があります、ファイル名リストをバイト値1区切りで渡された場合に、ファイル名をsplit関数で分割しようとする場合は引数区切り文字を新たに定義して対処します。参考:split関数
例
$引数区切り追加【タブ】(バイト値,2) (split(バイト値,2)(R0)(バイト値,2)(バイト値,1)) $引数区切り削除【タブ】(バイト値,2)
例2 上の例は非常に可読性が悪いので対策
$,【タブ】(バイト値,2) $引数区切り追加【タブ】(,) (split(,)(R0)(,)(バイト値,1)) $引数区切り削除【タブ】(,)
when,times,while,for関数で、区切り文字として(バイト値、1)などと書くと、関数が正しく動かなくなってしまうという現象があります。
里々は普通、かっこ()が入れ子になっている場合、内側のかっこから順に展開していきますが、if関数のように内側の処理系が先に実行されると逆に不都合のあるケースもあり、この対策にwhen,times,while,for関数は、内部のかっこの展開を遅延させる為の特別な処理をしています。
この処理の結果、引数区切り文字に(バイト値、1)などと書くと、そのかっこが展開されるタイミングも遅れてしまい、結果として区切り文字として認識できず、想定外の動作をしてしまうというわけです。
要は直接「バイト値」を書けば問題はありません。
手軽な方法として下記をreplace.txtにコピペし、以下引数区切りには(b1)を使うようにするというものがあります。
(b1)
透明なので見た目では分かりませんが、(b1)[タブ文字][1バイト文字]と書かれています。即ち、(b1)を1バイト文字に置換するという簡単な動作です。
一見結局かっこを使っているために正しく動かないように思われるかもしれませんが
、ミソはreplace.txtの置換処理が、辞書中のかっこが展開されるよりも先に行われる事です。従ってこの場合、whenなどの関数が実行される時には既に(b1)はバイト値1に置き換わっており、区切り文字として正しく認識されます。
(バイト値、1)とだけ書いて送信します。するとsatoriteの下のほうに、
\1\eと表示されるはずです。この\1と\eの間にある空白が紛れもなくバイト値1なので、これをコピーすればバイト値1が使えます(バイト値2以降も同様)。
OnTranslateでトーク全文に対して置換などの処理を行いたい場合など、トーク全文を関数の引数として渡すケースがあると思います。
そのような場合、里々の選択肢記法「_」や、さくらスクリプトの\q[...]タグがトーク中に存在していると、トーク中に必ずバイト値1が含まれることになります。従って、関数の区切り字には「、」や「,」だけでなく、バイト値1も使用できません。