プログラマブル準AIモジュール
「"華和梨" for あれ以外の何か以外の何か」
華和梨インラインスクリプト リファレンスマニュアル
2002/05/25
Phase 7.4.0
華和梨開発チーム
NAKAUE.T (Meister)
夢乃 (偽Meister)
酔狂
さとー
1. 概要
2. 書式
3. 評価、戻り値、真偽の判定
4. コマンド
4.1. コマンド一覧
4.2. コマンドリファレンス
4.2.1. 構文
4.2.2. コマンド-辞書操作
4.2.3. コマンド-ファイル操作
4.2.4. コマンド-カウンタ
4.2.5. コマンド-評価・比較
4.2.6. コマンド-SAORI
4.2.7. コマンド-出力
4.2.8. コマンド-補助機能
4.2.9. コマンド-その他
Appendix
I. インラインスクリプトの追加方法
II. 注釈
華和梨インラインスクリプト(KIS : Kawari Inline Script)は、 華和梨の辞書ファイル中で使用できる簡易言語です。 インラインスクリプトを使用することにより、 華和梨実行中に辞書へ単語を追加したり、 本体から通知されるイベントに応じた処理を行ったりすることができます。
インラインスクリプトは、単語中に「$(~)」 で囲んで記述します。一つの「$(~)」で囲まれた塊を、「ブロック」と呼びます。 一つのブロックの中には、複数の文を記述できます。 文と文の間は「;」(セミコロン)で区切ります。 一つの文は、一つのコマンドと零個以上の引数から構成されます。 コマンド、セミコロン、各引数の間は、それぞれ一つ以上の空白で区切ります。
インラインスクリプト: ブロック ブロック: $(文) $(文 ; 文 ; …) 文: コマンド名 引数1 引数2 …
ブロックがイベント呼び出し、発話要求等を通じて華和梨に解釈されることを、 「評価」と呼びます。ブロックは評価されると、「戻り値」を返します。 戻り値は一つの文字列で、どのような戻り値を返すかはコマンドによって異なります。 コマンドによっては、つねに「""」(空文字列)を返すこともあります。
ブロックが複数の文から成る場合、ブロックの戻り値は、 ブロック中の全ての文の戻り値を順に繋げたものです。 なお、ブロックから戻り値を返したくない場合、 silentコマンドを使用すれば抑制できます。
華和梨が戻り値を評価し、ブール代数における「真」か「偽」かを判定する際、 次のような基準で判定します。
この真偽の判定は、後述する構文コマンド、関数コマンド問わず共通です。 コマンドを独自に追加する場合、真偽の判定はこの基準に合わせて下さい。
コマンドは大きく分けて、ifコマンドや whileコマンドのような「構文コマンド」と、 adddictコマンドやdateコマンドの ような「関数コマンド」の二つに分類できます。 構文コマンドは与えられた条件の真偽に従い、処理の流れを制御します。一方、 関数コマンドは与えられた引数に従い、実際の処理を行います。 *1 *2
混同する恐れの無い場合、構文コマンドは「構文」、関数コマンドは単に 「コマンド」と呼ぶことがあります。
if | 条件判断 |
foreach | 指定エントリ中のすべての単語に対しコマンド実行 |
loop | 指定回数ループ |
silent | ブロックの出力を抑制 |
until | 条件が成立するまでループ |
while | 条件が成立している間ループ |
NULL | 空文字列 |
? | ランダム選択 |
辞書操作 | |
adddict | エントリに単語を追加 |
array | エントリを配列的に参照 |
clear | エントリを消去 |
enumerate | エントリの全単語を列挙 |
get | エントリを評価せずに参照 |
set | エントリに単語をセット |
size | エントリ中の単語数を数える |
ファイル操作 | |
load | 華和梨形式辞書ファイルを読み込む |
readdir | ディレクトリを読み込む |
save | エントリをファイルに保存 |
savecrypt | エントリをファイルに暗号化して保存 |
textload | テキストファイルを読み込む |
カウンタ | |
dec | 指定エントリの単語を数字と見なし減算する |
inc | 指定エントリの単語を数字と見なし加算する |
評価・比較 | |
expr | 式を評価する |
test | 値を比較する |
SAORI | |
saoriregist | SAORIを登録する |
saorierase | 登録を解除する |
callsaori | 登録したSAORIを呼び出す |
callsaorix | 登録したSAORIを呼び出す(高機能版) |
出力 | |
echo | 引数を空白文字で接続して返す |
escape | 引数内のさくらスクリプトをエスケープする |
補助機能 | |
chr | 指定した文字コードの一文字を返す |
entry | エントリを呼び出す |
eval | 単語を再評価 |
pirocall | 内蔵piroを呼び出す |
split | 文字列を区切り文字で分解 |
urllist | SHIORI/2.5形式のおすすめリストを出力する |
その他 | |
date | 日時を指定フォーマットで返す |
help | KISコマンドオンラインヘルプ |
rand | ランダムな整数を返す |
tolower | アルファベットを小文字にする |
toupper | アルファベットを大文字にする |
ver | バージョン番号取得 |
書式 | $(loop 回数 文1) |
戻り値 | 文1の戻り値 |
機能 | 指定回数だけ、文1を繰り返し評価する。 回数、文1にインラインスクリプトを用いる場合には、$()で囲む。 |
例 $(loop 10 "tick!") # 「tick!」と10回表示される |
書式 | $(silent) |
戻り値 | なし |
機能 | マルチステートメント中、silentが登場するまでの戻り値を破棄。 |
例 $(echo 1 ; echo 2 ; silent ; echo 3) #「3」がブロックの戻り値になる 参考 $(echo 1 ; echo 2 ; echo 3) #「123」がブロックの戻り値になる |
書式 | $(until 条件文 文1) |
戻り値 | 文1の戻り値 |
機能 | 条件文が偽の間、文1を繰り返し評価する。 条件文、文1にインラインスクリプトを用いる場合には、$()で囲む。 |
例 $(set A ${npw} ; set B ${npw} ; until $([ ${A} != ${B} ]) $(set B ${npw})) # AエントリとBエントリが必ず異なるようにする |
書式 | $(while 条件文 文1) |
戻り値 | 文1の戻り値 |
機能 | 条件文が真の間、文1を繰り返し評価する。 条件文、文1にインラインスクリプトを用いる場合には、$()で囲む。 |
例 $(set A ${npw} ; set B ${npw} ; while $([ ${A} == ${B} ]) $(set B ${npw})) # AエントリとBエントリが必ず異なるようにする |
書式 | $(NULL) |
戻り値 | なし(空文字列) |
機能 | 空文字列を返す。 |
例 $(if $([ ${test1} == $(NULL) ]) $(echo "test1はカラ") ) # test1エントリに何も入っていないか、空白を返されたときにメッセージを表示 |
書式 | $(? 文1 文2 ... 文n) |
戻り値 | 文1から文nまでの内どれか一つの戻り値 |
機能 | 引数として与えられた文から、どれか一つをランダムに選んで評価する。 拡張makotoの代用。 |
例 $(? "右" "左")"に行く" # 「右に行く」または「左に行く」と表示される |
書式 | $(clear エントリ1) |
戻り値 | なし |
機能 | エントリ1から内容をすべて削除する。 |
例 test1 : word1, word2, word3 $(clear test1) # test1エントリの内容を全て消去 |
書式 | $(enumerate エントリ1) |
戻り値 | 検索結果 |
機能 | エントリ1に含まれる全ての単語を、空白文字で接続して返す。 |
例 season : 春 , 夏 , 秋 , 冬 $(enumerate season) # 「春 夏 秋 冬」を返す |
書式 | $(readdir ディレクトリ エントリ1) |
戻り値 | なし |
機能 |
指定ディレクトリに含まれるファイル・ディレクトリ名を
エントリ1に保存する。エントリ1の以前の内容は消去される。 ディレクトリ名は相対パスも可。 |
例 $(readdir "..\..\shell" shell) # 自ゴーストで使用できるシェル一覧をshellに保存 |
書式 | $(expr EXPRESSION) |
戻り値 | EXPRESSIONの値。真偽値は"1"(真)か""(偽)で返る。 |
機能 |
EXPRESSIONで与えられた式を評価し、その値を返す。
GNU exprを規範とした機能、構文を持つ。
以下に留意のこと。
|
例: $(expr ${npw.special} | ${npw}) # npw.specialに内容があれば、それ。無ければnpwの置換結果が返る。 $(expr ${system.Sender} & ${system.Sentence}) # system.Sentenceとsystem.Sender双方に内容があれば、 # system.Senderが返る。 $(expr substr 1234567 1 3) # 出力 : 123 \u$(expr substr ${dms} 1 6)\w8\w8…\w8\w8…\w8\w8\w8\w8 \h\s[7]どうして途中で止めるんだよっ!\w8\e $(expr index 華和梨の代わり わ) # 出力 : 6 $(expr 20 * ( 3 + 2 ")") # 出力 : 100 $(expr ${system.Sender} & ( ${system.Sender} != まゆら ")") # system.Senderが空 → (出力無し) # system.Senderが"まゆら" → (出力無し) # system.Senderが"まゆら"以外 → system.Senderの値 $(expr find 華和梨の代わり わ) # 出力 : わ $(expr findpos 華和梨の代わり わ) # 出力 : 6 |
書式 | $(saoriregist DLLファイル エイリアス [ オプション ] ) |
戻り値 | なし |
機能 |
SAORIモジュールの登録。 DLLファイルには、相対パスまたは絶対パスでDLLを指定する。 エイリアスは、callsaoriコマンドでSAORIモジュールを呼ぶ際のキーワードを指定する。 オプションには、SAORIモジュールをロードするタイミングを指定する。 SAORIの中にはロードに時間のかかるものや、 呼ばれない可能性があることも考えられるため、 このような調整が可能となっている。 タイミングには"preload", "loadoncall", "noresident" の3種類があり、 それぞれ、「saoriregist時にロード」「最初にcallsaori(x)された時にロード」 「callsaori時にロードし、終わったら即アンロード」を意味する。 デフォルトはloadoncallである。 |
例 # saori_cpuid.dllをcpuidとして登録。今すぐロード。 $(saoriregist modules\saori_cpuid.dll cpuid preload) |
書式 | $(saorierase エイリアス) |
戻り値 | なし |
機能 | 登録済みのSAORIを登録から抹消する。 ロードされていたら併せてアンロードされる。 |
例 # cpuidをアンロード $(saorierase cpuid) |
書式 | callsaori エイリアス [ 引数 引数 ... ] |
戻り値 | SAORIの戻り値(Result) |
機能 | 戻り値が一つのSAORIを呼び出す。 |
例 sentence : \0\s[0]ここのOSは$(callsaori cpuid os.name)ね。\e |
書式 | callsaorix 戻り値格納エントリ エイリアス [ 引数 引数 ... ] |
戻り値 | SAORI呼び出し結果(Result) |
機能 | 複数の戻り値を持つSAORIを呼び出し、結果を得る。 SAORIの戻り値はValue[数値]ヘッダに格納されているが、 これを、「指定エントリ.Value[数値]」 エントリに格納する。 また、「指定エントリ.size」 に、得られた戻り値(Value)の数を返す。 |
例 # 早坂氏作のdate.dllを使い、日付を取得する $(callsaorix 日付 date) # 結果は次のエントリに記録される # 日付.Value0: 年 # 日付.Value1: 月 # 日付.Value2: 日 |
書式 | $(echo 単語1 ...) |
戻り値 | 全引数を空白文字で接続したもの |
機能 | 与えられた全引数を、空白文字で区切って返す。 |
例 $(echo 1 2 3 4 5) # 「1 2 3 4 5」が返る $(set test1 "TEST" ; echo ${test1}) # 「TEST」が返る |
書式 | $(escape 単語1 ...) |
戻り値 | 全引数を空白文字で接続し、「\」を「\\」に、「%」を「\%」に置換したもの |
機能 | 与えられた全引数のさくらスクリプトをエスケープする。 |
例 event.OnFileDropped : $(escape ${system.Reference0})がドロップされました。 # ドラッグ&ドロップされたファイル名を表示する |
書式 | $(chr 文字コード) |
戻り値 | 指定した文字コードの一文字 |
機能 | 指定した文字コードの一文字を返す。 |
例 $(chr 1) # いわゆる「バイト値1」が返る $(chr 2) # いわゆる「バイト値2」が返る |
書式 | $(entry エントリ名 単語1) |
戻り値 | ${エントリ名}の結果、または単語1 |
機能 |
エントリからランダムに単語を選び、評価する。
指定したエントリが空の場合、単語1を返す。 単語1は省略可能。省略した時に指定したエントリが空の場合、 空文字を返す。 evalでも同様のことが可能だが、entryの方が負荷が軽い。 |
例 $(entry "npw") # ${npw}と同じ $(entry "message."$(rand 3) ) # ${message.0}から${message.2}のどれか $(entry "system.OtherGhost" ${myname}) # ${system.OtherGhost}と同じ # 空の場合は${myname}の戻り値が返る |
書式 | $(eval 単語1 ...) |
戻り値 | デコード結果 |
機能 | 与えられた全引数中の${}、$()等を再度再帰的に評価し、 展開結果を返す。再帰的評価を行う以外はechoと同じ。 |
例 kawari : 華和梨 nise : 偽 shiori : 栞 niseshiori : ${nise}${shiori} $(eval "理夢の偽AIは${kawari}です") # 「理夢の偽AIは華和梨です」が返る $(eval "奈留の偽AIは${niseshiori}です") # 「奈留の偽AIは偽栞です」が返る 参考 $(set a "奈留の偽AIは${niseshiori}です") # aエントリの内容は #「奈留の偽AIは${niseshiori}です」 # になる |
書式 | $(pirocall #エントリ1 単語1) |
戻り値 | ローカルスクリプト形式ファイルの「#エントリ1」の本文、または単語1 |
機能 |
kawari.iniで読み込んだ「何か。(仮)」のローカルスクリプト
形式のファイルから、指定したエントリの本文を返す。
指定したエントリが無い場合、単語1を返す。 単語1は省略可能。 |
例 event.OnMouseDoubleClick : $(pirocall "#mainmenu") event.OnChoiceSelect : $(pirocall ${system.Reference0}) event.OnChoiceTimeout : $(pirocall "#timeout alternate") # ローカルスクリプトで実現したメニューを読み込んだ場合、 # これで従来と互換の動作をする event.OnBoot : $(entry "time."$(date %H) ) time.01, time.02, time 03 : $(pirocall "#bootup etc") time.04, time.05, time.06 : $(pirocall "#bootup early morning") time.07, time.08, time.09 : $(pirocall "#bootup morning") time.10, time.11, time.12 : $(pirocall "#bootup etc") time.13, time.14, time.15 : $(pirocall "#bootup etc") time.16, time.17, time.18 : $(pirocall "#bootup evening") time.19, time.20, time.21 : $(pirocall "#bootup early night") time.22, time.23, time.24 : $(pirocall "#bootup night") # 起動時間別メッセージをローカルスクリプトファイルから流用して表示 $(pirocall "#mainmenu" ${mainmenu}) # ローカルスクリプトのエントリ「mainmenu」が無い場合、 # 華和梨のmainmenuエントリの戻り値を返す |
書式 | $(split エントリ1 単語1 区切り文字列1) |
戻り値 | なし |
機能 |
単語1を区切り文字列1で分割し、エントリ1を基底とする
エントリ群に格納する。 分割した文字列の一つ目は「エントリ1.1」エントリ、 二つ目は「エントリ1.2」エントリに格納する。 分割数は「エントリ1.size」エントリに格納する。 |
例 $(split string "AA:BB:CC" ":") # AA、BB、CCに分割 $(split Header ${system.GhostEx} $(chr 1)) # GhostExヘッダをバイト値1で分割 $(split Msg "籠の中の鳥" "の") # 籠、中、鳥に分割 $(split test "1ch2ch3ch" "ch") # 1、2、3に分割 |
書式 | $(urllist サイト名1 URL1 バナーURL1 ... サイト名n URLn バナーURLn) |
戻り値 |
サイト名1[1]URL1[1]バナーURL1[2]...サイト名n[1]URLn[1]バナーURLn[2] ※[1]はバイト値1、[2]はバイト値2 |
機能 |
SHIORI/2.5規格に従い、「おすすめリスト」を生成する。
引数の数は必ず3の倍数になること。 仕切り線はサイト名に「-」を渡す。 |
例 futaba : "http://futaba.mikage.to/" kawari : "http://meister-d-i.hoops.ne.jp/" # さくら側のおすすめサイトのリスト resource.sakura.recommendsites : $(urllist "ふたばみかげ" ${futaba} ${futaba}"banner.png" "何か以外の何か" ${kawari} ${kawari}"banner.png") ※実際は一行 # うにゅう側のおすすめサイトのリスト resource.kero.recommendsites : $(urllist "ふたばみかげ" "http://futaba.mikage.to/" "banner.png") $(urllist "-" "-" "-") $(urllist "何か以外の何か" "http://meister-d-i.hoops.ne.jp/" "banner.png") ※実際は一行 # サイトごとにurllistコマンドを分けて書くことも出来る # 仕切り線の場合でも、ダミーのURLとバナーURLを与える必要がある |
書式 | $(date 書式文字列1) | ||||||||||||||||||||||||||||||
戻り値 | 日時の文字列 | ||||||||||||||||||||||||||||||
機能 |
書式文字列1に従って日時を返す。書式文字列には以下が使える。
|
||||||||||||||||||||||||||||||
例 event.OnBoot : $(entry "time."$(date %H) ) time.01 : 午前一時です\e time.02 : 午前二時です\e (中略) time.23 : 午後十一時です\e |
書式 |
$(help コマンド名) $(help) |
戻り値 | リファレンスまたはコマンド一覧 |
機能 |
コマンドが指定された場合は、リファレンスを返す。 コマンドが指定されない場合は、使用可能なコマンドの一覧を返す。 戻り値は"幸水"での出力を前提にしている。 |
例("幸水"での実行例) echo-mode > $(help help) help syntax : help Command1 return : help message comment : return online help of KIS commnad (for Kosui use) echo-mode > $(help) Command list : echo set (・・・中略・・・) escape echo-mode > |
書式 | $(rand 上限) |
戻り値 | 整数の文字列 |
機能 | 0から上限の乱数を返す。戻り値は0を含み、上限を含まない。 上限は負の数でもよい。 |
例 $(rand 52) # 0から51までの乱数を返す $(rand -10) # 0から-9までの乱数を返す |
書式 | $(tolower 文字列1 ...) |
戻り値 | 文字列中のアルファベット大文字を小文字に置換した結果 |
機能 | 文字列中のアルファベット大文字を小文字に置換する。 半角文字のみに作用する。 |
例 $(tolower ABC def) # 「abc def」が返る $(tolower XYZ XYZ) # 「XYZ xyz」が返る |
書式 | $(toupper 文字列1 ...) |
戻り値 | 文字列中のアルファベット小文字を大文字に置換した結果 |
機能 | 文字列中のアルファベット小文字を大文字に置換する。 半角文字のみに作用する。 |
例 $(toupper ABC def) # 「ABC DEF」が返る $(toupper xyz xyz) # 「xyz XYZ」が返る |
書式 | $(ver) |
戻り値 | バージョン情報 |
機能 |
"華和梨"のバージョン情報を返す。 バージョン情報のフォーマットは「基本名称[.補助名称[.補助名称]]/バージョン番号」。 |
例("幸水"での実行例) echo-mode > $(ver) KAWARI/6.2.0 |
インラインスクリプトの関数コマンドは、簡単に追加できるよう、華和梨の他の部分と 別のフォルダにソースが収めてあります。srcフォルダ中のkisフォルダがそれです。 自分で"華和梨"を拡張する際、KISの追加だけで望む機能が得られるか、まず検討して 下さい。この場合、華和梨のほかの機能へ与える影響が少なく、無用のエンバグを 避けられます。また、他の人がソースコードを再利用しやすくなるはずです。
KISコマンド追加の基本手順は以下の通りです。
0) ソースを書き換える前に、オリジナルのソースがMakeできるか確認する
1) ソースコードのkis_echo.h/kis_echo.cppをよく読んで、参考にする
2) 拡張するKISコマンドのヘッダファイルを用意する
3) ヘッダファイル名をkis_config.hに追加する
- config.hとkis_base.hをincludeする
- TKisFunction_baseクラスをpublicに継承し、コマンドのクラスを作る
- INLINE_SCRIPT_REGIST()マクロを使い、コマンドのクラスを登録
- メンバ関数Initに簡単な解説を書く
- メンバ関数string Function(vector<string>&)に処理を書く
4) cppが増えた場合、必ずファイル名をfiles.makに追加しておく
5) Make
良いKISができたら、ぜひ教えてください。オリジナルの"華和梨"にも採用したいと思います。
構文と関数の、実用上最も重要な違いは、
true : 真です。$(set tmp OK) # 下記の二つは、表示上は恐らく同じ結果だが… $(expr ${true} & ${cond}) # true文はcondが不成立でも実行されてしまう。 $(if ${cond} ${true}) # true文はcondが不成立なら実行されない。
コマンドに引数を与える時、エントリ呼び出しで与える場合を考えます。
$(expr $(entry ${EntryName}) | "Hello")
このケースで、EntryNameエントリに何もセットされていない場合を考えます。 この場合、exprコマンドの第1引数は空文字で、第2引数が「|」、第3引数が 「Hello」になります。 第1引数が「|」で、第2引数が「Hello」ということはありません。 インラインスクリプトに渡される引数の数と位置は、エントリ解釈の前に確定します。