#author("2023-11-10T18:34:07+09:00","default:post","post") #author("2023-11-11T07:18:28+09:00","default:post","post") *関数 [#we7d9214] 関数とはなんぞや。~ それは、''何かを入れると何かが返ってくるもの''です。~ 変数やトークを呼び出す時と同じように、[[かっこ()>特殊記号一覧#na7d3d63]]を使います。~ 大きく違うのは、「引数」と呼ばれるオプションがついていること。(ついていない時もある)~ (関数名、引数1、引数2、....) 関数名が使いたい機能、引数が処理して欲しいもの...という感じ。~ SAORIを使う時もこれと同じ仕組みです。~ ---- #contents ---- ~ *関連ページ [#x80e6d16] :[[関数一覧]]|里々で使用できる関数。~ 以前の内部間数とssu関数をまとめたページです([[Mc157-1>https://github.com/ponapalt/satoriya-shiori/wiki]]よりssuは内部関数と統合)。 :[[call関数]]|自作関数についてのページです。ユーザ関数とも。~ 里々では[[文(トーク)*>特殊記号一覧#d0671588]]・[[単語群@>特殊記号一覧#fbe5f29b]]をcall関数によって引数をつけて呼び出す事で実現します。~ :[[SAORI]]|里々でSAORIを組み込む方法などの解説。~ SAORIの呼び出し方は、基本的には関数と一緒。~ :[[SAORI/YAYA]]&br;[[SAORI/YAYA/統合関数一覧]]|里々と並んで有名なSHIORIである「YAYA」をSAORIとして登録し、関数や機能を拝借する方法。~ 何らかのデータ(引数)や命令を渡して、処理してもらった結果を受け取る流れになります。~ *引数区切りについて [#b92d8132] 一般的な関数の書式では、 (関数名[,引数1,引数2,…引数n]) のように記述しますが、この関数名や引数をそれぞれ区切る文字を''「引数区切り文字」''と呼びます。~ (上記書式では半角カンマ",")~ 引数区切り文字は標準で"," "," "、" "、" バイト値1が定義されています。~ これらは追加または削除が可能です。→[[特殊変数-引数区切り追加・削除>特殊変数#f7ace755]]~ 引数の文字列に区切り文字と同じ記号が含まれていれば、区切り文字として機能します。~ ただし、引数区切り文字が実際に機能するのは、最初に現れたもの一つだけ(らしい)です。従って、さくらスクリプトで使われる半角カンマなどが誤爆するのを防ぐ・引数区切り文字を文字列として使う場合…~ #────区切り文字がさくらスクリプトでも使われていると意図通りの動作をしない (関数名,hoge,\q[ほげ,メメタァ]) #────区切り文字を半角コンマ以外に書き換える (関数名、hoge、\q[ほげ,メメタァ]) (関数名、hoge、\q[ほげ,メメタァ]) (関数名,hoge,\q[ほげ,メメタァ]) これで半角カンマをただの文字列として動作させられます。~ **引数区切り文字問題 [#wbedea1a] 例:(R0)の中に半角カンマが含まれエラーが出る場合 (split,(R0),(バイト値,1)) 引数区切り文字を"、"に替えるとエラーを防げる (split、(R0)、(バイト値,1)) 引数の中に全ての区切り文字が含まれる可能性がある場合は一時的に引数内に含まれない文字を引数区切りとして設定する事でこの問題を回避します。参考:[[引数区切り追加・削除>特殊変数#f7ace755]] 例えばファイル名にはカンマ類の文字は全て含まれる可能性があります、ファイル名リストをバイト値1区切りで渡された場合に、ファイル名をsplit関数で分割しようとする場合は引数区切り文字を新たに定義して対処します。参考:[[split関数>関数一覧#split]] 例 $引数区切り追加【タブ】(バイト値,2) (split(バイト値,2)(R0)(バイト値,2)(バイト値,1)) $引数区切り削除【タブ】(バイト値,2) 例2 上の例は非常に可読性が悪いので対策 $,【タブ】(バイト値,2) $引数区切り追加【タブ】(,) (split(,)(R0)(,)(バイト値,1)) $引数区切り削除【タブ】(,) **when,times,while,forでバイト値を引数区切り文字にする場合の注意 [#ebbcd3ea] //参考:[[ばぐとら研究所統合ToDo>http://ssp.shillest.net/bts/guest.cgi?action=view_report&project=ms&id=88]]~ リンク切れ when,times,while,for関数で、区切り文字として(バイト値、1)などと書くと、関数が正しく動かなくなってしまうという現象があります。~ ***原因 [#i60436e5] 里々は普通、かっこ()が入れ子になっている場合、内側のかっこから順に展開していきますが、[[if関数>関数一覧#ifwhen]]のように内側の処理系が先に実行されると逆に不都合のあるケースもあり、この対策にwhen,times,while,for関数は、内部のかっこの展開を遅延させる為の特別な処理をしています。~ この処理の結果、引数区切り文字に(バイト値、1)などと書くと、そのかっこが展開されるタイミングも遅れてしまい、結果として区切り文字として認識できず、想定外の動作をしてしまうというわけです。~ ***対応策 [#q7a98c64] 要は直接「バイト値」を書けば問題はありません。~ 手軽な方法として下記をreplace.txtにコピペし、以下引数区切りには(b1)を使うようにするというものがあります。~ (b1) 透明なので見た目では分かりませんが、&color(#ff0000){(b1)[タブ文字][1バイト文字]};と書かれています。即ち、(b1)を1バイト文字に置換するという簡単な動作です。~ 一見結局かっこを使っているために正しく動かないように思われるかもしれませんが 、ミソはreplace.txtの置換処理が、辞書中のかっこが展開されるよりも先に行われる事です。従ってこの場合、whenなどの関数が実行される時には既に(b1)はバイト値1に置き換わっており、区切り文字として正しく認識されます。~ -参考~ バイト値を自力で書く場合、里々同梱のまずはsatoriteを起動し、下部の「里々」のチェックボックスにチェックが入っていることを確認して、~ (バイト値、1) とだけ書いて送信します。するとsatoriteの下のほうに、 \1\e と表示されるはずです。この\1と\eの間にある空白が紛れもなくバイト値1なので、これをコピーすればバイト値1が使えます(バイト値2以降も同様)。~ **選択肢(_、\q[])を含むスクリプトを関数の引数とする場合の注意 [#z06111e2] OnTranslateでトーク全文に対して置換などの処理を行いたい場合など、トーク全文を関数の引数として渡すケースがあると思います。 そのような場合、里々の選択肢記法「_」や、さくらスクリプトの\q[...]タグがトーク中に存在していると、トーク中に必ずバイト値1が含まれることになります。従って、関数の区切り字には「、」や「,」だけでなく、バイト値1も使用できません。