チートシート¶
里々の書き方を 1 ページにまとめた早見表です。くわしい説明は、各項目のリンク先を見てください。
里々の考え方¶
- 辞書は行頭の 1 文字で意味が決まります。
*は文、@は単語群、$は代入です。 - 関数も変数も単語群も、呼び出しはすべて
()です。()の中は、内側から順に展開されます。 - 記号は全角で書きます。半角の
$や(は里々の記法としては働きません。 - ただし、式の中の計算用のカッコだけは半角の
()です。 - 変数の中身は、数値も含めてすべて文字列です。
- 関数の引数の区切りは、全角の
、で書きます((calc、1+2))。
行頭の記号¶
| 書き方 | 意味 | 詳細 |
|---|---|---|
*名前 |
文(トーク)の始まり。*OnBoot のようにイベント名にすると、イベントの応答になる |
文と単語群 |
*(名前なし) |
ランダムトーク | ランダムトークとタイマ |
@名前 |
単語群の始まり。1 行が 1 単語 | 文と単語群 |
*名前【タブ】式 @名前【タブ】式 |
採用条件式。式が真のときだけ候補になる | 採用条件式 |
$名前【タブ】値 |
変数に文字列をそのまま代入 | 変数 |
$名前=式 |
式を計算して代入(整数は全角数字になる) | 式 |
>名前 |
別の文へジャンプ(戻ってこない) | 制御構造 |
>名前【タブ】式 |
式が真のときだけジャンプ | 同上 |
_ラベル【タブ】ID |
選択肢(\q[ラベル,ID] になる)。後ろにタブで引数を足すと、ID の文で (A0)〜になる |
選択肢 |
: |
喋るキャラクターの切り替え(0 と 1 が交互) | スコープとサーフェス |
# |
以降はコメント | 前処理 |
φ |
次の 1 文字をそのまま表示(φ( φ) φ#) |
前処理 |
行末の φ |
改行を打ち消して次の行と連結 | 同上 |
(数字) |
サーフェスの切り替え((0) (-1)) |
スコープとサーフェス |
\ % で始まるもの |
さくらスクリプトと置換タグ。そのまま出力 | さくらスクリプトの扱い |
辞書の最小例¶
*OnBoot
$好感度=(好感度)+1
:(0)こんにちは。今日は(現在曜日)曜日ですね。
:(5)(好きな色)が好きです。
>親密なあいさつ【タブ】(好感度)>=3
@好きな色
赤
青
*親密なあいさつ
:また会えましたね。
- 文は、次の
*か@の行の手前までです。 - 同じ名前の文や単語群を複数書くと、ランダムに 1 つが選ばれます(重複回避で偏りを調整できます)。
- 各行の終わりには、自動で
\nが付きます(自動挿入)。
()の中身¶
(名前) は、次の順に調べて最初に見つかったものになります(名前の解決順序)。
| 順 | 種類 | 例 |
|---|---|---|
| 1 | 関数((名前、引数…)) |
(calc、1+2) |
| 2 | 単語群 | (好きな色) |
| 3 | 文 | (初回のあいさつ) |
| 4 | 変数・R0 などの参照値 |
(好感度) |
| 5 | 数字 | (10)(サーフェス切り替え) |
| 6 | 組み込み名 | (現在年) (乱数1~6) |
| 7 | 見つからない | (名前) のまま残り、ログに not found |
- 入れ子は内側から展開されます。
((今日のおやつ)の説明)は(ケーキの説明)になります。 - 引数の区切りは
、,、,のどれか。最初に見つかった 1 種類だけが使われます。 - 引数の中の
()は、先にすべて展開されます。ただし特殊形式(whenなど)は、必要な引数だけを展開します。
変数と式¶
代入の違い¶
| 書き方 | X の値 |
|---|---|
$X=1+1 |
2(全角) |
(set、Y、1+1) |
2(半角。(set) は式を計算しないが、数字で始まる引数は先に計算される) |
$X【タブ】1+1 |
1+1(そのまま) |
$X=(値が空) |
変数を削除 |
- 変数がないとき、
(X)は(X)のまま残ります。式の中では0になります。 - 存在確認は
(変数「X」の存在)(1か0)。値がなければ0にするなら(変数「X」か0)。 - 数字だけの名前の変数は作れません。
- 変数は終了時にセーブデータへ保存されます。
今回は…で始まる変数とS0は保存されません。
式で使える演算子¶
| 種類 | 演算子 |
|---|---|
| 算術 | + - * / % ^ |
| 比較 | < > <= >= == != |
| 論理 | && || ! |
| 計算順序のカッコ | 半角の ( )(全角の ( ) は展開に使われる) |
- 整数は 64 ビットです。小数は calc_float を使います。
- 0 が偽、0 以外が真です。
- 全角の
+<=なども半角として扱われます。 ==!=は文字列の比較なので、01==1は偽です。
式を使える場所は、$名前=式、採用条件式、>名前【タブ】式、when whenlist times while for の引数、calc などです(式)。
制御構造¶
| やりたいこと | 書き方 |
|---|---|
| 文の候補を条件で絞る | *名前【タブ】式(採用条件式) |
| 別の文へ移る(戻らない) | >名前 >名前【タブ】式 |
| 別の文を呼ぶ(戻る) | (名前) (call、名前、引数…) |
| 2 分岐 | (when、式、真、偽) |
| 多分岐 | (whenlist、値、<30、冷たい、<70、ふつう、親しい) |
| n 回繰り返す | (times、3、(C0)) → 012 |
| 範囲で繰り返す | (for、1、3、(C0)) → 123 |
| 条件で繰り返す | (while、(C0)<3、(C0)) → 012 |
| 名前を呼びながら繰り返す | (loop、名前、3)(カウンタは (名前カウンタ)) |
when と if の違い
when(里々の特殊形式)は、選ばれた枝だけを展開します。ssu の if は、両方の枝を展開してから選びます。(set) などの副作用がある枝には when を使ってください。
while の無限ループ
while の条件が偽にならないと、繰り返しが止まりません。結果が $括弧展開サイズ制限 を超えたとき(Mc201-7以降)、または呼び出しと繰り返しの合計が $呼び出し総数制限(既定 100000)を超えたとき(Mc201-8以降)に打ち切ります。
引数・参照値¶
| 名前 | 意味 |
|---|---|
(R0) (R1)… |
イベントの Reference0, 1… |
(A0) (A1) (Aの数) |
call / vncall で渡された引数 |
(S0) (S1) (Sの数) |
直前の SAORI(ssu を含む)の戻り値 |
(H1) (H2)… |
このトークで展開した () の結果の履歴 |
(C0) (C1) |
ループカウンタ(内側が C0) |
詳細は引数・参照値の名前。
よく使う組み込み名¶
| 名前 | 値 |
|---|---|
(現在年) (現在月) (現在日) (現在曜日) (現在時) (現在分) (現在秒) |
現在の日時(曜日は 日 月…) |
(乱数1~6) |
下限以上、上限以下の整数。区切りは ~。半角で書くと半角で返る |
(起動回数) |
起動のたびに 1 増える |
(文「名前」の存在) (単語群「名前」の存在) (変数「名前」の存在) |
1 か 0 |
(文「名前」の数) (単語群「名前」の数) |
定義の数 |
(最終トークからの経過秒) |
最後に喋ってからの秒数 |
(イベント名) |
いま処理しているリクエストの ID |
(里々のバージョン) |
phase Mc201-1 のような文字列 |
時刻・状態の名前の全部は、時刻・経過時間と状態・存在確認にあります。
内蔵関数¶
里々本体に入っている関数です(一覧)。
| 関数 | 書式 | 用途 |
|---|---|---|
| set | (set、名前、値) |
変数へ代入(() の中から使う) |
| call | (call、名前、引数…) |
引数付きで呼び出す。受け側は (A0) |
| vncall | (vncall、呼び出し先、名前…) |
名前を評価した結果を引数にして呼ぶ |
| when | (when、式、真、偽) |
条件分岐(特殊形式) |
| whenlist | (whenlist、値、条件1、結果1、…、それ以外) |
比較の連続(特殊形式) |
| times | (times、回数、本体) |
繰り返し |
| for | (for、開始、終了、本体) |
範囲で繰り返し |
| while | (while、条件、本体) |
条件で繰り返し |
| loop | (loop、名前、最大) |
名前を繰り返し呼ぶ |
| 合成単語群 | (合成単語群、名前1、名前2) |
複数の単語群から 1 つ選ぶ |
| 文の数 | (文の数、名前) |
文の数 |
| 単語の追加 | (単語の追加、単語群、単語) |
実行時に単語を追加(セーブされる) |
| split_to | (split_to、接頭辞、文字列、区切り) |
分割して、接頭辞0 接頭辞1… の変数に入れる |
ローカルのみの関数
set call loop などは、SecurityLevel: local でないリクエスト(外部からのイベント)では実行されず、空になります。一覧は内蔵関数にあります。
ssu の関数¶
同梱の ssu の関数です(一覧)。引数の先頭が数字・+・- のとき、里々が先に整数として計算します。
| 種類 | 書式 | 例 → 結果 |
|---|---|---|
| 計算 | (calc、式) |
(calc、1+2) → 3 |
| 小数の計算 | (calc_float、式) |
引数の計算を止めないと整数になる(下の注意) |
| 条件 | (if、式、真、偽) (unless、…) |
両方の枝が展開される |
| 番号で選ぶ | (nswitch、n、候補1、候補2、…) |
(nswitch、2、a、b、c) → b(1 から数える) |
| 値で選ぶ | (switch、値、比較値1、結果1、…、それ以外) |
|
| 条件で選ぶ | (iflist、値、条件1、結果1、…、それ以外) |
|
| 切り出し | (substr、文字列、開始、長さ) |
(substr、あいうえお、1、2) → いう(開始は 0 から) |
| n 文字目 | (at、文字列、位置) |
|
| 分割・結合 | (split、文字列、区切り) (join、区切り、文字列…) |
分割結果は (S0) (S1)…(上書きしたくないときは内蔵の (split_to、接頭辞、文字列、区切り)) |
| 置換 | (replace、文字列、前、後) |
(replace、abc、b、X) → aXc |
| 削除・数える | (erase、文字列、削除する文字列) (count、対象、探す文字列) |
|
| 正規表現(Mc203-1以降) | (regex_match、対象、パターン、オプション) (regex_find、…) (regex_findall、…) (regex_count、…) (regex_replace、対象、パターン、置換後、オプション) (regex_replace_first、…) (regex_erase、…) (regex_erase_first、…) (regex_split、…) (regex_escape、文字列) |
オプションは i(大小無視)s m x。(regex_match、abc123、(\d+))(S1) → 123(書き方) |
| 比較 | (compare、A、B) (compare_head、…) (compare_tail、…) |
_case 付きは大文字小文字を区別する |
| 判定 | (length、文字列) (is_empty、…) (is_digit、…) (is_alpha、…) |
|
| 変換 | (zen2han、…) (han2zen、…) (hira2kata、…) (kata2hira、…) |
|
| 書式 | (sprintf、書式、値…) |
(sprintf、%05d、42) → 00042 |
| ランダム | (choice、候補1、候補2、…) |
calc_float の落とし穴
(calc_float、5/3) は、5/3 が先に整数で計算されて 1 になります。小数で計算するときは $SAORI引数の計算=無効 にします(ssu の引数の計算)。
里々が決まったタイミングで実行する文¶
| 名前 | 実行されるとき |
|---|---|
*初期化 |
satori_conf.txt の読み込み直後。システム変数の設定を書く |
*OnSatoriLoad |
辞書の読み込み後。重複回避の設定などをここに書く |
*OnSatoriBoot |
辞書の読み込み後。結果が最初の OnBoot の応答になる |
*OnSatoriClose |
終了時。空でなければ終了の応答になる |
*OnSatoriUnload |
アンロード直前 |
*OnSatoriSecondChange |
秒ごと。ほかに何も喋らなかったとき |
*OnSatoriTimer |
*名前 のないタイマが発動したとき。(A0) が名前 |
*COMMUNICATE該当なし |
話しかけられたが、該当する文がなかったとき |
イベント(OnBoot OnClose OnMouseDoubleClick など)は、同じ名前の文があれば実行されます(イベントの処理)。マウスは *0Headつつかれ のような名前の文が使われます(デフォルトの動作)。
よく使うシステム変数¶
$名前=値 で設定します。有効 と書いたときだけ真で、無効 などは偽です(システム変数)。
| 変数 | 内容 |
|---|---|
$喋り間隔=120 |
ランダムトークの間隔(秒)。0 で喋らない |
$名前タイマ=秒数 |
その秒数のあとに *名前(なければ *OnSatoriTimer)を実行する |
$次のトーク=名前 |
次のランダムトークを予約する |
$自動改行挿入=無効 |
行末の \n を付けない |
$自動挿入ウェイトタイプ=無効 |
自動ウェイトを入れない(里々 一般 無効) |
$今回は喋らない=有効 |
この応答では何も返さない |
$単語群「名前」の重複回避=有効、トーク中 |
同じ単語が続かないようにする |
$SAORI引数の計算=無効 |
SAORI の引数を里々が先に計算しない |
$デバッグ=有効 |
ShioriEcho などのデバッグ機能を使えるようにする |
ハマりやすいところ¶
satori_conf.txtには*初期化と@SAORIしか書けません。 ほかの文や単語群は、読み込み後に捨てられます。辞書があることが前提の設定(重複回避など)は、*OnSatoriLoadに書きます。$X=1+1は全角の2、(set、X、1+1)や(calc、1+2)は半角です。 全角と半角は計算では区別されませんが、==は文字列の比較です。- 式の中のカッコは半角です。 全角の
()は展開されます。 >のジャンプは戻りません。 戻りたいときは(名前)で呼びます。()の展開結果に区切り文字が入ると、引数が余分に分かれます。 通常の関数は、先に展開してから引数に分けるためです。- 同じ名前の文・単語群・変数を作らないでください。 単語群、文、変数の順に見つかります。
- タブで区切る場所があります。
$名前【タブ】値、*名前【タブ】条件、_ラベル【タブ】IDは、タブが区切りです(半角スペースは不可)。【タブ】はタブ文字 1 文字の意味です(【タブ】について)。 ()が閉じていないと、辞書の読み込みでエラーになります。 カッコの中は改行できますが、閉じ忘れに注意します。whileの無限ループは止まりません。 条件を必ず偽にします。
動作確認¶
$デバッグ=有効 にして、ShioriEcho でその場で試せます(ShioriEcho とデバッグ)。エラーはエラーメッセージ・警告にあります。