関数一覧に統合しました。


ssuとは、里々に標準同梱されている SAORI です。
あれ?あの関数が無い?それはたぶんあっちにありますよ。→ 内部関数




注意点

引数にまだ何も入ってない変数を入れるとエラーが出るので注意。
この問題は整備班カスタム版里々で解消されました。

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

calcは小数点以下を無視(切り捨て?)して計算する。
ifやswitchなどの引数は、暗黙のうちにこれを実行している。

(calc,計算式)

calc_float

calc_floatは小数点以下も計算する。

(calc_float,計算式)

ただしこのままだと整数で計算した結果を渡してしまうため、自動計算は無効にしておく必要がある。

*
$SAORI引数の計算【タブ】無効
:計算するよー。5÷2は(calc_float,5÷2)っ!
$SAORI引数の計算【タブ】自動
 ↓ 
計算するよー。5÷2は2.5っ!

条件分岐

if

条件式を評価し、真(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関数で、解決が簡単になりました。

unless

条件式を評価し、偽(0 か 0)ならば偽の結果を返す。 そうでないならば、真の結果を返す(真の結果が書かれている場合)か、空を返す(真の結果を省略している場合)。

(unless,条件,偽の結果[,真の結果])

iflist

ifと違う点は、条件式が左右に分かれたことと、複数の条件を順番に評価できること。

(iflist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]])
(iflist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]],偽の結果)
  1. 左辺と右辺1を組み合わせた条件式を評価し、真ならば結果1を返す。
  2. そうでなければ左辺と右辺2と組み合わせ、真ならば結果2を返す。
  3. そうでなければ左辺と右辺3を…以下略。

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

#例
(iflist,(現在時)==,6,朝飯,12,昼飯,15,おやつ,17,ディナー)

例では演算子を左辺に使っていますが、右辺に使っても動作します。

switch

条件並列分岐。左辺も右辺も数値でないとダメ(エラーになる)。

まず、左辺と右辺1が等しいか比較し、等しければ結果1を返す。 そうでなければ次の右辺2と比較し、等しければ結果2を返す。 そうでなければ…(以下略)。 いずれの右辺とも等しくなければ、空を返す。

(switch,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]])

120以降、それ以外の場合を書けるようになった。どの右辺とも等しくなかった場合に、それ以外の場合を返す。

(switch,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]],それ以外の場合)
*
:今月は(switch、
(現在月)、
1、お正月ですね、
2、バレンタインデーがあります、
3、ひなまつりがあります、
5、こどもの日があります、
8、夏休みですね、
12、クリスマスがあります、
特に何もありません)。

nswitch

数値による分岐。switchをシンプルにしたような。

数値が1なら結果1を返す。 数値が2なら結果2を返す。 数値が…(以下略)。

数値の部分に文字列が入っていたり、数値が0以下だったり、数値が結果の数より大きい値だったりした場合は、空を返す。

(nswitch,数値,結果1[,結果2[…,結果n]])
*
:サイコロを振りました。
(nswitch、(乱数1〜6)、一、ニ、三、四、五、六)がでました。

切り出し

substr

文字列の一部(開始位置から取り出す長さの分)を取り出す。

(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,あ、、い、う,、)
(split,あ、、い、う,、,0)
(split,あ、、い、う,、,0,1)

文字列を分割します、関数の返り値は文字列の分割数を返します、分割された文字列は変数S0,[S1,S2...Sn]に格納されます。

  • 区切文字列以降を省略した場合は1文字づつに分割します。
  • 最大分割数に1以上を指定すると分割数が最大分割数以上になる場合、最後の変数Snに残り文字列が全て格納されます。最大分割数に0を指定すると無制限に分割します。
  • 空要素分割に1を指定すると文字列内に区切文字列が連続していている場合は空の要素として分割します、空要素分割に0を指定すると空要素は無視されます。
    例~
    (split,あ、、い、う,、,0,1) 結果(S0)=あ(S1)=[空](S2)=い(S3)=う
    (split,あ、、い、う,、,0,0)  結果(S0)=あ(S1)=い(S2)=う

関数の返り値の分割数をそのままトークに利用するのでなければ、変数に代入するかnop関数を使用して値を捨てます。

$分割数【タブ】(split,文字列[,分割文字列[,最大分割数][,空要素分割]]])
(nop,(split,文字列[,分割文字列[,最大分割数[,空要素分割]]]))

単語群のひとつの単語から2語以上拾ったり、日時取得時に時分秒を付けたりするのに便利です。


  • 分割文字列は、全て一文字ごとに判定される事に注意して下さい。すなわち、
    (split,焼きイカ風味カルビ味ソイソース,イカ)
  • としたとき『焼き』『風味カルビ味ソイソース』に分割されるのではなく『焼き』『』『風味』『ルビ味ソ』『ソース』と、イとカそれぞれ一文字で分割されます。
    • つまり
      • ×『焼きイカ風味カルビ味ソイソース』
      • ○『焼き風味ルビ味ソソース』
    • ということ。
  • 二文字以上からなる文字列で分割したい場合は、予めreplaceを使って適当な(一文字の)記号に置換してから、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の一番最初の該当文字だけ置き換える版。

(replace_first,文字列,検索語,置換する語)
(replace_first,なまむぎなまごめなまたまご,なま,生)
 ↓ 
生むぎなまごめなまたまご

消去

erase

文字列の中の特定の文字を消す。

(erase,文字列,消去する語)
(erase,なまむぎなまごめなまたまご,なま)
 ↓ 
むぎごめたまご

erase_first

eraseの一番最初の該当文字だけ消す版。

(erase_first,文字列,消去する語)
(erase_first,なまむぎなまごめなまたまご,なま)
 ↓ 
むぎなまごめなまたまご

検索

count

文字列の中に、特定の検索語がいくつ含まれているかを数える。
条件式に使うなら、単純に文字列検索として使える。

(count,文字列,検索語)
「なまむぎなまごめなまたまご」の中に
「なま」は(count,なまむぎなまごめなまたまご,なま)個入っています。
 ↓ 
「なまむぎなまごめなまたまご」の中に
「なま」は3個入っています。

比較

compare

文字列1と文字列2が等しければ1(真)、そうでないなら0(偽)を返す。

(compare,文字列1,文字列2)
  • 里々Mc143-10/Rev2より
    この関数による比較は、大文字・小文字、半角・全角を同一と見なします。
    (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関数

compare_head

文字列1の先頭に文字列2が含まれていれば1(真)、そうでないなら0(偽)を返す。

(compare_head,文字列1,文字列2)

里々Mc143-10/Rev2より、この関数による比較は半角・全角を同一と見なします。(Compareと異なり大文字・小文字は同一と見なしません)
里々Mc150-1より、大文字・小文字を同一と見なします。

関連→compare_head_case関数

compare_tail

文字列1の末尾に文字列2が含まれていれば1(真)、そうでないなら0(偽)を返す。

(compare_tail,文字列1,文字列2)

里々Mc143-10/Rev2より、この関数による比較は半角・全角を同一と見なします。(Compareと異なり大文字・小文字は同一と見なしません)
里々Mc150-1より、大文字・小文字を同一と見なします。

関連→compare_tail_case関数

compare_case

半角全角を同一視し、大文字小文字を同一視しないcompare関数

(compare_case,文字列1,文字列2)

里々Mc150-1より追加、使用にはsatori_conf.txtSAORI定義 の追加修正が必要

compare_head_case

半角全角を同一視し、大文字小文字を同一視しないcompare_head関数

(compare_head_case,文字列1,文字列2)

里々Mc150-1より追加、使用にはsatori_conf.txtSAORI定義 の追加修正が必要

compare_tail_case

半角全角を同一視し、大文字小文字を同一視しないcompare_tail関数

(compare_tail_case,文字列1,文字列2)

里々Mc150-1より追加、使用にはsatori_conf.txtSAORI定義 の追加修正が必要

文字数取得

length

文字列の文字数(バイト数じゃないよ)を返す。

(length,文字列)

フォーマット出力

sprintf

引数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

is_emptyは引数が空文字列であるかを判定。空文字列なら1(真)、そうでないなら0(偽)を返す。

(is_empty,引数)

is_digit

is_digitは引数が数値であるかを判定。数値なら1(真)、そうでないなら0(偽)を返す。 Mc147-5以降、小数点一つまで許容するよう仕様変更。

(is_digit,引数)

下記のどちらかの記述で、引数が整数の場合のみ1(真)を返す。Mc147-5r2以降。

(is_digit,引数,整数)(is_digit,引数,integer)

is_alpha

is_alphaは引数がアルファベットの文字列であるかを判定。アルファベットの文字列なら1(真)、そうでないなら0(偽)を返す。

(is_alpha,引数)

文字列変換

zen2han

文字列中の全角である「数字、アルファベット、カナ、一部の記号」を半角に変換。

Mc137-1以降で変換タイプの指定が可能。 数字・アルファベット・カナ・記号 が指定可能で、複数指定・任意の組み合わせが可能。 指定は空白等適当な文字で区切って行い、指定したタイプのもののみ変換されます。省略時は全指定。

(zen2han,文字列[,変換タイプ])

han2zen

文字列中の半角である「数字、アルファベット、カナ、一部の記号」を全角に変換。

Mc137-1以降で変換タイプの指定が可能。 数字・アルファベット・カナ・記号 が指定可能で、複数指定・任意の組み合わせが可能。 指定は空白等適当な文字で区切って行い、指定したタイプのもののみ変換されます。省略時は全指定。

(han2zen,文字列[,変換タイプ])

kata2hira

文字列中のカタカナをひらがなに変換。

(kata2hira,文字列)

hira2kata

文字列中のひらがなをカタカナに変換。

(hira2kata,文字列)

接続

join

120から追加。対象1〜nを連結文字列で繋いだものを返す。

(join,連結文字列,対象1[,対象2[…,対象n]])
(join,と,グー,チョキ,パー)
 ↓
グーとチョキとパー
(calc,(join,+,1,2,3,4,5))
 ↓
(calc,1+2+3+4+5)
 ↓
15

選択

choice

124から追加。引数1〜nの中からランダムに1つを選んで返す。

(choice,引数1[,引数2[…,引数n]])
*
:何が釣れた?
:(choice,鯛,イワシ,鮫,くじら,長靴)が釣れたよ。

新規追加分

Mc129くらいから追加? 暫定的なものかもしれないので仕様変更の可能性アリ

reverse

「文字列」を「列字文」にする。

(reverse,文字列)
*
:「(reverse,ねないこだれだ)!」
:「だれだこいなね」って、ねぇ…。

at

0から始まる指定文字数目の文字を抜き出す

(at,文字列,引数1)
(at,お酒に逃げた,3)→逃

lsimg

指定フォルダ内の画像ファイルの数を調べる

(lsimg,絶対パス)
*
:(lsimg,D:\アレな画像)個もの画像ファイルが見つかったんだけどー。

mkdir

フォルダを作る 成功したら1、失敗したら0を返す

(mkdir,絶対パスorベースウェアからの相対パス)
*フォルダ作成
>成功【タブ】(mkdir,ghost\satori\ghost\master\新規フォルダ)==1
:失敗したみたい…。

*成功
:新規フォルダをつくったよ。

*1 半角スペース。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-24 (土) 23:47:53 (294d)