Mc157-1よりssu関数が里々内部に統合された事に伴い、最新の内容は関数一覧に統合されています。
本記事の内容は以前までの古いものになります。
引数にまだ何も入ってない変数を入れるとエラーが出るので注意。
この問題は整備班カスタム版里々で解消されました。
ssuはSAORIなので、予めsatori_conf.txtの@SAORIにて使用する宣言が必要です。
テンプレートゴーストを改造して使う場合、恐らく大半が既に記述されているはずですが、多くの人が最初に使うであろう「ポストと狛犬」には、choiceとjoinが記述されていません。
ですので、ポストと狛犬の辞書を改変してゴーストを作っている人は以下の二行を追加しておくのをお勧めします。
choice,saori/ssu.dll,choice join,saori/ssu.dll,join
また、Mc129以降なら更に下記の追加をお勧めします。
reverse,saori/ssu.dll,reverse at,saori/ssu.dll,at lsimg,saori/ssu.dll,lsimg mkdir,saori/ssu.dll,mkdir
Mc150-1以降で追加
compare_case,saori/ssu.dll,compare_case compare_head_case,saori/ssu.dll,compare_head_case compare_tail_case,saori/ssu.dll,compare_tail_case
SAORIの登録(satori_conf.txt)や関数の解説を見てみると、ssuのSAORI宣言の特徴が見えてくると思います。
それは、各々のSAORI呼び出しエイリアス名を、全て第一引数に使っていること。
よって@SAORIには上の登録をしなくても
ssu,saori/ssu.dll
とだけ登録しておいて、
* (ssu,calc,1+1)
と、第一引数に「使いたいときだけ」関数コマンドを入れる形でもOKです。
ただし、辞書の記述量がちょっぴり増えるのと、何より内部関数とssuの関数を全て個別に把握する必要があるので難易度は高めです。
calcは小数点以下を無視(切り捨て?)して計算する。
ifやswitchなどの引数は、暗黙のうちにこれを実行している。
(calc,計算式)
calc_floatは小数点以下も計算する。
(calc_float,計算式)
ただしこのままだと整数で計算した結果を渡してしまうため、自動計算は無効にしておく必要がある。
* $SAORI引数の計算【タブ】無効 :計算するよー。5÷2は(calc_float,5÷2)っ! $SAORI引数の計算【タブ】自動 ↓ 計算するよー。5÷2は2.5っ!
条件式を評価し、真(0 と 0 以外?)ならば真の結果を返す。
そうでないならば、偽の結果を返す(偽の結果が書かれている場合)か、空を返す(偽の結果を省略している場合)。
(if,条件式,真の結果[,偽の結果])
例
* $たこ数【タブ】(乱数0~3) :たこが(たこ数)匹釣れました。今日は(if,(たこ数)>1,大漁,普通)です。 :(if,(たこ数)==0,普通ってお前、釣れてないだろそれ……。)
※if関数内で set関数を次の様に記述しても、条件式により真偽のいずれかの項が実行されると言う動作はしません、これは里々が内側の括弧から展開する為で、条件式が評価される前に真偽両方の項が処理されてしまう為です。
#例文 (if,(乱数0~1),(set,hoge,0),(set,moge,1)) #解決策1 ((if、(乱数0~1)、set,hoge,0、set,moge,1)) #解決策2 (when,(乱数0~1),(set,hoge,0),(set,moge,1))
解決策1はif関数の結果はただの文字列、if関数が展開された後、外側の括弧によりset関数が有効になるというもの。あまり直感的では無いかもしれません。
解決策2は里々Mc145-1以降に追加されたwhen関数で、解決が簡単になりました。
条件式を評価し、偽(0 か 0)ならば偽の結果を返す。 そうでないならば、真の結果を返す(真の結果が書かれている場合)か、空を返す(真の結果を省略している場合)。
(unless,条件,偽の結果[,真の結果])
ifと違う点は、条件式が左右に分かれたことと、複数の条件を順番に評価できること。
(iflist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]])
(iflist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]],偽の結果)
左辺と右辺の文字列を単純に結合した結果を数式として取り扱い真偽判定するので、結合した結果が正しい数式となるよう注意してください。
通常は左辺の右端か右辺の左端のいずれかに演算子(==とか)を入れる必要があります。
偽の結果は120以降に追加されたもので、いずれの条件も満たさない場合に返します。
偽の結果が指定されていない場合は、空を返します。
#例 (iflist,(現在時)==,6,朝飯,12,昼飯,15,おやつ,17,ディナー)
例では演算子を左辺に使っていますが、右辺に使っても動作します。
条件並列分岐。
まず、左辺と右辺1が等しいか比較し、等しければ結果1を返します。 そうでなければ次の右辺2と比較し、等しければ結果2を返します。 そうでなければ…(以下略)。 いずれの右辺とも等しくなければ、空を返します。
(switch,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]])
120以降、それ以外の場合を書けるようになりました。どの右辺とも等しくなかった場合に、それ以外の場合を返します。
(switch,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]],それ以外の場合)
内部では、
(左辺)==(右辺1) (左辺)==(右辺2) (左辺)==(右辺3)
…
というふうに数式を使い真偽を判定しているので、左辺・右辺ともに「括弧を展開した結果が数値として扱えるもの」にする必要があります。
また、上記仕組みのため、iflist/whenlistと比べて、処理速度はほとんど変わりません。
サンプル:
* :今月は(switch、 (現在月)、 1、お正月ですね、 2、バレンタインデーがあります、 3、ひなまつりがあります、 5、こどもの日があります、 8、夏休みですね、 12、クリスマスがあります、 特に何もありません)。
数値による分岐。switchをシンプルにしたような。
数値が1なら結果1を返す。 数値が2なら結果2を返す。 数値が…(以下略)。
数値の部分に文字列が入っていたり、数値が0以下だったり、数値が結果の数より大きい値だったりした場合は、空を返す。
(nswitch,数値,結果1[,結果2[…,結果n]])
* :サイコロを振りました。 (nswitch、(乱数1~6)、一、ニ、三、四、五、六)がでました。
文字列の一部(開始位置から取り出す長さの分)を取り出す。
(substr,文字列,開始位置[,取り出す長さ])
120以降、開始位置、長さ共にマイナス値を指定できるようになった。
開始位置の場合 0 1 2 3 4 5 あいうえおかきくけこ -5-4-3-2-1
長さの場合(開始位置が「か」の場合) 1 2 3 4 5 あいうえおかきくけこ -5-4-3-2-1
(substr,あいうえおかきくけこ,5,3) (substr,あいうえおかきくけこ,5,-3) ↓ かきく うえお
(split,分割する文字列[,区切文字列[,最大分割数[,空要素分割]]])
例
(split,あ、、い、う) (split,あ、、い、う,、) (split,あ、、い、う,、,0) (split,あ、、い、う,、,0,1)
文字列を分割します、関数の返り値は文字列の分割数を返します、分割された文字列は変数S0,[S1,S2...Sn]に格納されます。
(split,あ、、い、う,、,0,1) 結果(S0)=あ(S1)=[空](S2)=い(S3)=う (split,あ、、い、う,、,0,0) 結果(S0)=あ(S1)=い(S2)=う
関数の返り値の分割数をそのままトークに利用するのでなければ、変数に代入するかnop関数を使用して値を捨てます。
$分割数【タブ】(split,文字列[,分割文字列[,最大分割数][,空要素分割]]]) (nop,(split,文字列[,分割文字列[,最大分割数[,空要素分割]]]))
単語群のひとつの単語から2語以上拾ったり、日時取得時に時分秒を付けたりするのに便利です。
(split,焼きイカ風味カルビ味ソイソース,イカ)
よくイベントの引数(R0など)で使用されているバイト値1区切りのデータを分割するには、同じくssu関数のsprintfと組み合わせます
(split,(R0),(sprintf,%c,1))
※里々/整備班カスタムMc134-901以降より(バイト値、1)で使用可能になりました。
分割文字列にカンマ","が良く使われますのでこれで文字列を分割する場合は下記のようにします。
(split、(R0)、,)
また文字列に","や"、"が両方とも含まれる可能性がある場合は、引数区切り文字を新たに定義する事で対応します。使用する文字は文字列中に含まれないと断定可能な文字ならなんでも良いですが通常はバイト値を使用しましょう
$B3【タブ】(バイト値、3) $引数区切り追加【タブ】(B3) (split(B3)(R0)(B3)(バイト値、1)) $引数区切り削除【タブ】(B3)
特殊変数の引数区切り参考
文字列の中の特定の文字を別な文字に置き換える。
(replace,文字列,検索語,置換する語)
(replace,なまむぎなまごめなまたまご,なま,生) ↓ 生むぎ生ごめ生たまご
replaceの一番最初の該当文字だけ置き換える版。
(replace_first,文字列,検索語,置換する語)
(replace_first,なまむぎなまごめなまたまご,なま,生) ↓ 生むぎなまごめなまたまご
文字列の中の特定の文字を消す。
(erase,文字列,消去する語)
(erase,なまむぎなまごめなまたまご,なま) ↓ むぎごめたまご
eraseの一番最初の該当文字だけ消す版。
(erase_first,文字列,消去する語)
(erase_first,なまむぎなまごめなまたまご,なま) ↓ むぎなまごめなまたまご
文字列の中に、特定の検索語がいくつ含まれているかを数える。
条件式に使うなら、単純に文字列検索として使える。
(count,文字列,検索語)
「なまむぎなまごめなまたまご」の中に 「なま」は(count,なまむぎなまごめなまたまご,なま)個入っています。 ↓ 「なまむぎなまごめなまたまご」の中に 「なま」は3個入っています。
文字列1と文字列2が等しければ1(真)、そうでないなら0(偽)を返す。
(compare,文字列1,文字列2)
(compare,ABC,ABC) (compare,ABC,ABC) (compare,ABC,abc) (compare,ABCダ,AbCダ)上記の実行結果はいずれも1となります。
(if,"A=="=="A==",1,0)その様な場合は compare関数を使う事に成りますが、compare関数は大文字小文字・半角全角無視を行うので、文字列中に比較演算子を含む可能性がある文字列比較を大文字小文字・半角全角無視せずに行いたい場合は手段がありません…… yaya as saori でユーザー関数作っちゃう?
関連→compare_case関数
文字列1の先頭に文字列2が含まれていれば1(真)、そうでないなら0(偽)を返す。
(compare_head,文字列1,文字列2)
里々Mc143-10/Rev2より、この関数による比較は半角・全角を同一と見なします。(Compareと異なり大文字・小文字は同一と見なしません)
里々Mc150-1より、大文字・小文字を同一と見なします。
関連→compare_head_case関数
文字列1の末尾に文字列2が含まれていれば1(真)、そうでないなら0(偽)を返す。
(compare_tail,文字列1,文字列2)
里々Mc143-10/Rev2より、この関数による比較は半角・全角を同一と見なします。(Compareと異なり大文字・小文字は同一と見なしません)
里々Mc150-1より、大文字・小文字を同一と見なします。
関連→compare_tail_case関数
半角全角を同一視し、大文字小文字を同一視しないcompare関数
(compare_case,文字列1,文字列2)
里々Mc150-1より追加、使用にはsatori_conf.txtのSAORI定義 の追加修正が必要
半角全角を同一視し、大文字小文字を同一視しないcompare_head関数
(compare_head_case,文字列1,文字列2)
里々Mc150-1より追加、使用にはsatori_conf.txtのSAORI定義 の追加修正が必要
半角全角を同一視し、大文字小文字を同一視しないcompare_tail関数
(compare_tail_case,文字列1,文字列2)
里々Mc150-1より追加、使用にはsatori_conf.txtのSAORI定義 の追加修正が必要
文字列の文字数(バイト数じゃないよ)を返す。
(length,文字列)
引数1~nをフォーマットに従って変換したものを返す。
(sprintf,フォーマット[,引数1[,引数2[…,引数n]]])
フォーマットは、
(sprintf,%02d月%02d日,12,3)
のように、「%」から始まる「フォーマット指定子」を含む文字列
フォーマット指定子の出現順と対応する順序の引数が、フォーマット指定子の出力の元となる
整備班verでは実数(小数点以下)も扱えるように。
基本の書きかた
%[フラグ指定][最小幅指定][.精度指定][出力指定]
出力指定以外は省略可能
フラグ指定
指定 | 説明 |
+ | 常に正負符号を表示する |
- | 最小幅に足りない分だけ末尾を半角スペースで埋める(左詰) |
*1 | 最小幅に足りない分だけ先頭を半角スペースで埋める |
0 | 最小幅に足りない分だけ先頭を0で埋める |
# | 代替形式。後述 |
複数続けて指定できる(競合する場合は後に書いた方優先)
「0」「 」の「先頭」は、正負符号がある場合はその後ろ
全角文字は2幅分と数える
#出力結果:ユーザ 様 (sprintf,%-10s様,ユーザ) #出力結果:1234年05月06日 (sprintf,%04d年%02d月%02d日,1234,5,6) #出力結果:-1+3は? (sprintf,%+d%+dは?,-1,+3) #出力結果:- 12 (sprintf,% 5d,-12)
最小幅指定
文字列の最小幅(最小文字数)を指定できる
数字を入れる場合、正負符号や小数点「.」も数えることに注意
フラグ指定と合わせて用いる
#出力結果: -12 #フラグ「 」を指定した場合と異なり空白は符合よりも前 (sprintf,%6d,-12) #出力結果:-012 (sprintf,%04d,-12)
精度指定
「.」に続けて実数の有効桁数が指定できる
#出力結果:3.142 (sprintf,%1.3f,3.141529)
出力指定
指定 | 対応する引数 | 説明 | 引数「63」の出力例 |
s,S | 全て | 文字列をそのまま表示(sもSも同じ) | 63 |
c,C | 整数 | 指定した10進整数に対応する文字を表示(cもCも同じ) | ? |
d,u | 実数 | 10進整数で表示(dは符号なし、uは符号付き) | 63 |
o,i | 実数 | 8進整数で表示(oもiも同じ) | 77 |
x,X | 実数 | 16進符号なし整数で表示(xは小文字表記、Xは大文字表記) | 3f |
f | 実数 | 実数を少数形式(固定小数点による標準記法)で表示 | 63.000000 |
e,E | 実数 | 実数を指数形式(科学的記法)で表示(eは小文字表記、Eは大文字表記) | 6.300000+e001 |
g,G | 実数 | f,eのうち適した方の形式で表示(gは小文字表記、Gは大文字表記) | 63.000000 |
フラグ「#」の代替形式について
変換指定に応じて意味が変わる
o,x,Xの場合:基数を明確にする
f,e,E,g,Gの場合:常に小数点を表示
他:無視される
#出力結果:0XA (sprintf,%#X,10)
補足
引数の番号指定はできない
is_emptyは引数が空文字列であるかを判定。空文字列なら1(真)、そうでないなら0(偽)を返す。
(is_empty,引数)
is_digitは引数が数値であるかを判定。数値なら1(真)、そうでないなら0(偽)を返す。 Mc147-5以降、小数点一つまで許容するよう仕様変更。
(is_digit,引数)
下記のどちらかの記述で、引数が整数の場合のみ1(真)を返す。Mc147-5r2以降。
(is_digit,引数,整数)(is_digit,引数,integer)
is_alphaは引数がアルファベットの文字列であるかを判定。アルファベットの文字列なら1(真)、そうでないなら0(偽)を返す。
(is_alpha,引数)
文字列中の全角である「数字、アルファベット、カナ、一部の記号」を半角に変換。
Mc137-1以降で変換タイプの指定が可能。 数字・アルファベット・カナ・記号 が指定可能で、複数指定・任意の組み合わせが可能。 指定は空白等適当な文字で区切って行い、指定したタイプのもののみ変換されます。省略時は全指定。
(zen2han,文字列[,変換タイプ])
文字列中の半角である「数字、アルファベット、カナ、一部の記号」を全角に変換。
Mc137-1以降で変換タイプの指定が可能。 数字・アルファベット・カナ・記号 が指定可能で、複数指定・任意の組み合わせが可能。 指定は空白等適当な文字で区切って行い、指定したタイプのもののみ変換されます。省略時は全指定。
(han2zen,文字列[,変換タイプ])
文字列中のカタカナをひらがなに変換。
(kata2hira,文字列)
文字列中のひらがなをカタカナに変換。
(hira2kata,文字列)
120から追加。対象1~nを連結文字列で繋いだものを返す。
(join,連結文字列,対象1[,対象2[…,対象n]])
(join,と,グー,チョキ,パー) ↓ グーとチョキとパー
(calc,(join,+,1,2,3,4,5)) ↓ (calc,1+2+3+4+5) ↓ 15
124から追加。引数1~nの中からランダムに1つを選んで返す。
(choice,引数1[,引数2[…,引数n]])
* :何が釣れた? :(choice,鯛,イワシ,鮫,くじら,長靴)が釣れたよ。
Mc129くらいから追加? 暫定的なものかもしれないので仕様変更の可能性アリ
「文字列」を「列字文」にする。
(reverse,文字列)
* :「(reverse,ねないこだれだ)!」 :「だれだこいなね」って、ねぇ…。
0から始まる指定文字数目の文字を抜き出す
(at,文字列,引数1)
(at,お酒に逃げた,3)→逃
指定フォルダ内の画像ファイルの数を調べる
(lsimg,絶対パス)
* :(lsimg,D:\アレな画像)個もの画像ファイルが見つかったんだけどー。
フォルダを作る 成功したら1、失敗したら0を返す
(mkdir,絶対パスorベースウェアからの相対パス)
*フォルダ作成 >成功【タブ】(mkdir,ghost\satori\ghost\master\新規フォルダ)==1 :失敗したみたい…。 *成功 :新規フォルダをつくったよ。