#author("2022-12-13T09:32:55+09:00","default:post","post")
[[関数一覧]]に統合しました。
#author("2022-12-14T10:20:28+09:00","default:post","post")
#br
#br
----

里々に最初から登録されている関数。~
[[satori_conf.txt>ファイル構成#j3e3ee70]]の[[SAORI定義>ファイル構成#q327057d]]を全て削除しても使える物。~
あれ?あの関数が無い?それはたぶんあっちにありますよ。→ [[外部関数/ssu]]

''Mc157-1よりssu関数が里々内部に統合された事に伴い、最新の内容は[[関数一覧]]に統合されています。''~
本記事の内容は以前までの古いものになります。
----
#contents
----
~

#br
#br
#br
*単語の追加 [#q08bca51]
(単語の追加、くだもの、バナナ)
単語群@くだものに単語バナナが追加されます。
 @くだもの
 りんご
追加された単語の情報はsatori_savedata.txtに保存されます。~
%%dic***.txtのどこかに既にその単語群が記述してあり、その中に1つ以上単語が入っている必要があります。%%~
@くだものが無ければ新規に作成します。~
%%追加した単語の削除、編集はできません。%%
里々Mc135-1で修正されました。


*追加単語の削除 [#j6416b0b]
 (追加単語の削除、単語群名、単語)
単語の追加で入れた単語のみ削除。 


*追加単語の全削除 [#xd552114]
 (追加単語の全削除、単語群名)
単語の追加で入れた単語を全て削除。 

 (追加単語の削除、単語群名、単語)
単語の追加で入れた単語のみ削除可能
 


*合成単語群 [#y6f35e01]
里々Mc140-1以降で使用可能です。
 (合成単語群、A、B、C)
A/B/Cそれぞれの単語群の内容全てからランダム選択されます。

 @A
 りんご
 みかん
 
 @B
 にんじん
 じゃがいも
 
 @C
 いか
 たこ

*バイト値 [#c2695bea]
 (バイト値、1)
こう書くとバイト値1が簡単に得られるように。~
ほかにバイト値3なども同じ書き方で得ることができる。~

1だとメールを処理する時の分割子がバイト1なので、リプレイスとかでバグる可能性あり。~
1ではないものを推奨する、が、0とか入れると大変なことになるらしい。~
分割子は自分でも設定できるので、使わない記号が一番安全かも。 ~

''&color(#ff0000){[注意]when,times,while,forについて};''~
これらの関数は、引数内の括弧を展開するタイミングを遅らせる仕様の関係から、~
(バイト値、1)などの関数が実行されるタイミングも遅れてしまうので、~
(バイト値、1)で引数を区切ろうとしても、正しく認識されないようです。~
whenはifと同じ処理になり、ループ系の関数は(C0)が常に空になります。~
[[⇒対処法>関数#ebbcd3ea]]

*call [#z2243505]
[[call関数]]を参照のこと。~
ちょっと特殊なので別ページに移してあります。

*vncall [#lb8dc660]
Mc158-1から追加。
call関数に与える引数を「名前」で与えるバージョンの関数。~
 $v0【タブ】ユーザ名
 $v1【タブ】ユーザさん
 (vncall,set,v0,v1)
このように書くと、呼び出す際に
 (call,set,(v0),(v1))
こういったイメージで解釈され、v0とv1がその名前の「中身」に置き換えられます。
最終的に
 (set,ユーザ名,ユーザさん)
と呼び出したのと同じ結果が得られます。
ただし、「最初に引数を区切った後はそれ以降引数を区切らない」というルールがあります。~
これにより里々の区切り文字問題を解決できます。~
たとえばssuのsplit関数を使って文字を「,(カンマ)」で区切りたい場合、普通に呼び出すと「,」が区切り文字として解釈されて期待する結果が得られませんが、vncallで次のように書くと期待通りの結果を得ることが出来ます。
 $v0【タブ】区切りたい,文字
 $v1【タブ】,
 (vncall,split,v0,v1)
ただし、vncallはwhenのような引数を解釈するタイミングに違いのある関数を呼び出した場合をサポートしておらず、よくわからない結果になることがあるので使わないように気をつけてください。

*nop [#n969619d]
 (nop,引数)
何もしない。さおりの戻り値を捨てるときなどに使う。~
特にSAORIのmciaudioなどでお世話になるはず。


*remember [#qe9933e0]
 (remember,位置)
過去に話した内容の取得。zero origin なので(remember,0)で直前。 


*set [#v0928166]
 (set,変数名,値)
変数に値を代入する。(値が式の場合計算結果が入る)
 $変数名=値
と基本的には同じ。~
(set,変数名,)と空を代入する事で変数の削除ができる点も同じ。~
各種[[特殊変数]]への設定についても使用できる。~
関連→[[変数]]~
~
以下に「$変数名=値」の記法との違いを列挙すると、
-一行として扱われる($変数名=値は行として数えられない)
-文中でも使える
--行頭に書く必要がない
--単語群中でも使える($変数名=値は不可)
-値の数値計算は引数の自動計算の仕様に準ずる
--特殊変数「[[SAORI引数の計算>特殊変数#hedbd483]]」が無効だと引数が計算されない
--計算結果は必ず半角数値となる($変数名=値だと必ず全角数値)
-変数名や値に区切り文字に使っている文字が含まれていないか注意する必要が発生する

*sync [#rcde9506]
 (sync,物,引数1,引数2...引数n)
処理をしゃべりと同期させる。~
SAORIを任意のタイミングで発動させる時に。~

*when [#c8fbcc67]
 (when,式,真の場合[,偽の場合])
Mc145-1より追加。詳しくは[[こちら:http://emily.shillest.net/specwiki/index.php?bugyo%2F%E9%87%8C%E3%80%85%E6%8B%A1%E5%BC%B5%E6%A1%88]]。~
「式」が計算され、結果が0以外なら「真の場合」を返し、0なら「偽の場合」を返す。~
平たくいうとカッコ内を後で計算する [[if>外部関数/ssu#wb2dd863]]関数で、機能は引数が事前に評価されない点を除いて"if"と同じ。

''&color(#ff0000){[注意]引数区切りについて};''~
when関数の区切りを(バイト値、1)のように''括弧で呼び出すと''~
ifと同じ動作になってしまうようです。~
[[⇒対処法>関数#ebbcd3ea]]~

さんぷる1、ifとwhenの動作の違い
 *さんぷる1
 :ifの場合
 (set、変数1、0)(set、変数2、0)
 (if、1、(set、変数1、1)、(set、変数2、1))
 変数1は(変数1)#=>1
 変数2は(変数2)#=>1
 :whenの場合
 (set、変数1、0)(set、変数2、0)
 (when、1、(set、変数1、1)、(set、変数2、1))
 変数1は(変数1)#=>1
 変数2は(変数2)#=>0

さんぷる2、再帰呼出し(関数の中で自分自身を関数として呼び出す)
 *さんぷる2
 :10の階乗は(call、階乗、10)です。
 
 @階乗
 (when、(calc、1<(A0))、
 	(calc、(A0)*(call、階乗、(calc、(A0)-1)))、
 	1)

**whenlist [#y20bdab0]
 (whenlist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]][,偽の結果])
//Mc156-1より追加。詳しくは[[こちら:http://ssp.shillest.net/bts/guest.cgi?id=110&project=ms&action=view_report]]。~
whenと違う点は、条件式が左右に分かれたことと、複数の条件を順番に評価できること。~
[[if>内部関数#wb2dd863]]に対する[[iflist>内部関数#xc487586]]のような立ち位置の関数で、~
iflistとは違い、結果の引数は条件が決まるまで事前に評価されません。

+左辺と右辺1を組み合わせた条件式を評価し、真ならば結果1を評価して返します。~
+そうでなければ左辺と右辺2と組み合わせ、真ならば結果2を評価して返します。~
+そうでなければ左辺と右辺3を…以下略。

左辺と右辺の文字列を単純に結合した結果を数式として取り扱い真偽判定するので、結合した結果が正しい数式となるよう注意してください。~
通常は''左辺の右端か右辺の左端のいずれかに演算子(==とか)を入れる''必要があります。

偽の結果はいずれの条件も満たさない場合に返されます。~
偽の結果が指定されていない場合は、空を返します。

''さんぷる1、使い方''~
 *さんぷる1
 (whenlist、(現在時)==
 	、6、朝飯
 	、12、昼飯
 	、15、おやつ
 	、17、ディナー
 	、間食)

上記のサンプルが動作するとき、以下のように動作します。例として、(現在時)は「12」としましょう。~
+左辺の「(現在時)==」と右辺1の「6」を連結して評価します。~
「(現在時)==6」は、現在時が12なので、偽(成立しない)となり、結果1の「朝飯」は実行されません。~
+次に、左辺の「(現在時)==」と右辺2の「12」を連結して評価します。~
「(現在時)==12」は、現在時が12なので、真(成立する)となり、結果2の「昼飯」が実行されません。~
+成立するものがあったので、それ以降の右辺と結果は実行されません。~
結果、上記のwhenlist関数は「昼飯」を返します。

''さんぷる2、iflistとwhenlistの動作の違い''~
 *さんぷる2
 :iflistの場合
 (set、変数1、0)(set、変数2、0)(set、変数3、0)
 (iflist、1==
 	、1、(set、変数1、1)
 	、0、(set、変数2、1)
 	、(set、変数3、1))
 
 変数1は(変数1)#=>1
 変数2は(変数2)#=>1
 変数3は(変数3)#=>1
 
 :whenlistの場合
 (set、変数1、0)(set、変数2、0)(set、変数3、0)
 (whenlist、1==
 	、1、(set、変数1、1)
 	、0、(set、変数2、1)
 	、(set、変数3、1))
 
 変数1は(変数1)#=>1
 変数2は(変数2)#=>0
 変数3は(変数3)#=>0

*ループ関数 [#f2f36b91]
里々ではループは構文でサポートされていない為、関数または[[ジャンプ文>ループ処理#bcb72342]]で実現します。~
loop関数のみ昔からある関数で、times,for,while関数は、整備班verで追加された関数です。~
この二つにはループ本文やループカウンタの扱いで下記の差があります。
-ループ本文
--loop関数~
ループ本文を関数外に用意する必要があります、引数として呼出先の[[*>特殊記号一覧#d0671588]]または[[@>特殊記号一覧#fbe5f29b]]名を渡します。
--times,for,while関数~
ループ本文を引数として記述出来ます、関数外にループ本文を置く場合は明示的に呼び出す必要があります。
-ループカウンタ名 (ループ中にループ回数を数えている変数)
--loop関数~
("呼出先の[[*>特殊記号一覧#d0671588]]または[[@>特殊記号一覧#fbe5f29b]]名"カウンタ)
--times,for,while関数~
[[(C0)>情報取得変数#s8d0383c]]、多重ループの場合は上位のループカウンタを(C1)、(C2)…と参照出来ます。~

ループブレイクは loop,for,times関数では出来ません、while関数か[[ジャンプ文によるループ>ループ処理#bcb72342]]を使って下さい。~

''&color(#ff0000){[注意]引数区切りについて};''~
times,while,for関数は、括弧の展開を遅らせる仕組みの関係上、~
(バイト値、1)のように''引数区切りを括弧で呼び出すと''、~
(C0)の中身が常に空となり、正しく動作しないようです。~
[[⇒対処法>関数#ebbcd3ea]]

**loop [#befbab37]
ある文または単語群を指定回数ぶんループさせる関数。~
この関数のみループ本文を関数外で(トークや単語群で)書かないといけません。使用例~

 (loop,文または単語群名,回数)
 (loop,文または単語群名,開始値,終了値)
 (loop,文または単語群名,開始値,終了値,増分)
 
 *文または単語群名
 ループさせたい本文

ループ中は本文に''([文または単語群名]カウンタ)''という名前の変数が使用できるようになります。~

-&color(#ff0000){回数}; ... [文または単語群名]をループさせる回数です。
-&color(#ff0000){開始値、終了値、増分}; ... カウンタの開始値~終了値を制御します。
--増分は1ループ時に増加するカウンタ量。当然、デフォルトは1です。
--開始値~終了値を設定すると、ループ回数は ( [終了値]-[開始値] )÷[増分] 回となります。

単語群での使用例 

 *
 :好きな食べ物は (loop,好きな食べ物,3)だよ
 
 @好きな食べ物
 すきやき、
 焼肉、
 フライドチキン、
 焼き鳥、
 シャブシャブ、
 手羽先、

カウンタとトークでの使用例(ヘッドラインを変数に落とす) 

 *installedheadlinename
 (loop,HL格納,0,(Rの数))
 
 *HL格納
 $HL(HL格納カウンタ)【タブ】(R(HL格納カウンタ))

プログラミング的な記述の仕方に慣れている人はloopより[[times>内部関数#ad356074]]の方が使いやすいかも。




**times [#ad356074]
指定回数ループを繰り返す。

 (times,回数[,カウンタ初期値],ループ本体)

Mc146-1より実装。詳しくは[[こちら:http://emily.shillest.net/specwiki/index.php?bugyo%2F%E9%87%8C%E3%80%85%E6%8B%A1%E5%BC%B5%E6%A1%88]]。~
「ループ本体」を「回数」回繰り返し、戻り値を連結して返す。~
loopとはちょっと違う。プログラムに慣れてる人はこちらの方が分かりやすいかも。~

 #----loopとtimesの指定方法の違い。どちらも同じものを出力する。
 *サンプル
 (loop,ただの幼女好きの犬コロ,3)
 (times,3,(ただの幼女好きの犬コロ))
 
 @ただの幼女好きの犬コロ
 エンテイ



**while [#j5492cb7]
Mc146-1より実装。「式」を計算した値が真(0以外)である間、ループ本体を繰り返し結果を連結して返す。~
''ループ方法をちょっとミスっただけで容易く無限ループに陥るので注意。''~

 (while,条件式[,カウンタ初期値],ループ本体)

使用例

 *異なる乱数を二つ得る
 $ランダム1【タブ】(乱数0~9)
 $ランダム2【タブ】(乱数0~9)
 (while,(ランダム1)==(ランダム2),(set,ランダム2,(乱数0~9)))





**for [#ddee11c7]
指定開始値から増分づつカウンタを増加させ終了値迄ループを繰り返す。

 (for,開始値,終了値[,増分],ループ本体)

Mc146-1より実装。詳しくは[[こちら:http://emily.shillest.net/specwiki/index.php?bugyo%2F%E9%87%8C%E3%80%85%E6%8B%A1%E5%BC%B5%E6%A1%88]]。~
カウンタが「開始値」から「終了値」に向かって「増分」ずつ進み、その度に「ループ本体」を繰り返し、結果を連結して返す。~
(C0)も同様に「開始値」から「終了値」に向かって「増分」ずつ進む。~
「開始値」が「終了値」より大きい値で「増分」にマイナス値も指定出来る。~
loopと構文が入れ替わった感じ。when同様、カッコは事前に評価されない……はず。~

使用例(ヘッドラインを変数に落とす)
 *installedheadlinename
 (for,0,(Rの数)-1,(HL格納))
 
 *HL格納
 $HL(C0)【タブ】(R(C0))
または
 *installedheadlinename
 (for,0,(Rの数)-1,(set、HL(C0)、(R(C0))))

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS