関数のきほん。
ちょっと難しいが、使いこなせるようになるとグッと制作の幅が広がる。




関数の基本

関数は、変数やトークを呼び出す時と同じくかっこ()で使用します。
大きく違うのは、「引数」と呼ばれるオプションがついていること。

(関数名、引数1、引数2、....)

(使いたい機能、オプション指定や処理して欲しい文...)という感じで覚えればOK。
SAORIも基本的にはこれと同じ仕組みです。

内部関数

里々自身が持つ関数です。
satori_conf.txtSAORI定義を全て削除しても使えます。

  • 内部関数
    #記述例(count関数)
    (count,なまむぎなまごめなまたまご,なま)
    →3
    #記述例(set関数とwhen関数)
    (set,変数,1)
    (when,(変数)==1
    	,変数は1だよ!
    	,1じゃないよ!
    )
    →変数は1だよ!

外部関数

基本的にSAORIを使ったものを指します。呼び出しの仕方は内部関数と変わりません。

  • SAORI SAORIって何? 他のSAORIの組み込み方法は?
  • 外部関数/yaya yayaをSAORIとして使用する

★ 文(yaya)や華和梨などの栞はSAORIとして運用することもできます。
具体的には、何らかのデータ(引数)や命令を文や華和梨に渡して、処理してもらう流れになります。つまり他の栞の多機能な部分だけ拝借できるというわけ。

ユーザー関数

ユーザ関数とは利用者が自分で作成する関数のこと。
関数・手続き・サブルーチン・プロシージャと呼んだりもします。

ユーザ関数は()call関数文(トーク)*単語群@を呼び出すもの全般、またはcall関数によるものを指します。

引数区切りについて

一般的な関数の書式では、

(関数名[,引数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でバイト値を引数区切り文字にする場合の注意

参考:ばぐとら研究所統合ToDo
when,times,while,for関数で、区切り文字として(バイト値、1)などと書くと、関数が正しく動かなくなってしまうという現象があります。

原因

里々は普通、かっこ()が入れ子になっている場合、内側のかっこから順に展開していきますが、if関数のように内側の処理系が先に実行されると逆に不都合のあるケースもあり、この対策にwhen,times,while,for関数は、内部のかっこの展開を遅延させる為の特別な処理をしています。
この処理の結果、引数区切り文字に(バイト値、1)などと書くと、そのかっこが展開されるタイミングも遅れてしまい、結果として区切り文字として認識できず、想定外の動作をしてしまうというわけです。

対応策

要は直接「バイト値」を書けば問題はありません。
手軽な方法として下記をreplace.txtにコピペし、以下引数区切りには(b1)を使うようにするというものがあります。

(b1)	

透明なので見た目では分かりませんが、(b1)[タブ文字][1バイト文字]と書かれています。即ち、(b1)を1バイト文字に置換するという簡単な動作です。
一見結局かっこを使っているために正しく動かないように思われるかもしれませんが 、ミソはreplace.txtの置換処理が、辞書中のかっこが展開されるよりも先に行われる事です。従ってこの場合、whenなどの関数が実行される時には既に(b1)はバイト値1に置き換わっており、区切り文字として正しく認識されます。

  • 参考
    バイト値を自力で書く場合、里々同梱のまずはsatoriteを起動し、下部の「里々」のチェックボックスにチェックが入っていることを確認して、
    (バイト値、1)
    とだけ書いて送信します。するとsatoriteの下のほうに、
    \1\e
    と表示されるはずです。この\1と\eの間にある空白が紛れもなくバイト値1なので、これをコピーすればバイト値1が使えます(バイト値2以降も同様)。
    サクラエディタの場合、バイト値(コントロールコード)を半角中黒(・)で表示させることも出来るので、引数区切りに直接バイト値を書いてしまうのもありでしょう。

選択肢(_、\q[])を含むスクリプトを関数の引数とする場合の注意

OnTranslateでトーク全文に対して置換などの処理を行いたい場合など、トーク全文を関数の引数として渡すケースがあると思います。

そのような場合、里々の選択肢記法「_」や、さくらスクリプトの\q[...]タグがトーク中に存在していると、トーク中に必ずバイト値1が含まれることになります。参照→里々の内部処理について
従って、OnTranslateでの処理では、関数の区切り字に「、」や「,」だけでなく、バイト値1も使用できません。

統合関数一覧


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-26 (土) 13:24:59 (90d)