プログラマブル準AIモジュール "華和梨"
インラインスクリプト リファレンスマニュアル
2005/07/03
Phase 8.2.3
華和梨開発チーム :
NAKAUE.T (Meister), 偽Meister (夢乃), さとー, 酔狂, さくらのにえ
Index
← back
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. コマンド-補助機能
4.2.10. コマンド-その他
Appendix
I. インラインスクリプトの追加方法
II. 注釈
1. 概要
華和梨インラインスクリプト(KIS : Kawari Inline Script)は、
華和梨の辞書ファイル中で使用できる簡易言語です。
インラインスクリプトを使用することにより、
華和梨実行中に辞書へ単語を追加したり、
本体から通知されるイベントに応じた処理を行ったりすることができます。
2. 書式
インラインスクリプトは、単語中に「$(〜)」
で囲んで記述します。一つの「$(〜)」で囲まれた塊を、「インラインスクリプトブロック」と呼びます。
一つのブロックの中には、複数の文を記述できます。
文と文の間は「;」(セミコロン)で区切ります。
一つの文は、一つのコマンドと零個以上の引数から構成されます。
コマンド、セミコロン、各引数の間は、それぞれ一つ以上の空白で区切ります。
インラインスクリプト:
ブロック
ブロック:
$(文)
$(文 ; 文 ; …)
文:
コマンド名 引数1 引数2 …
3. 評価、戻り値、真偽の判定
ブロックがイベント呼び出し、発話要求等を通じて華和梨に解釈されることを、
「評価」と呼びます。ブロックは評価されると、「戻り値」を返します。
戻り値は一つの文字列で、どのような戻り値を返すかはコマンドによって異なります。
コマンドによっては、つねに「""」(空文字列)を返すこともあります。
ブロックが複数の文から成る場合、ブロックの戻り値は、
ブロック中の全ての文の戻り値を順に繋げたものです。
なお、ブロックから戻り値を返したくない場合、
silentコマンドを使用すれば抑制できます。
華和梨が戻り値を評価し、ブール代数における「真」か「偽」かを判定する際、
次のような基準で判定します。
- 空文字列「""」、文字列「"0"」、文字列「"false"」ならば「偽」
- 「偽」以外ならば「真」("ほげ"、"1"、"true"、" "(空白)...)
この真偽の判定は、後述する構文コマンド、関数コマンド問わず共通です。
コマンドを独自に追加する場合、真偽の判定はこの基準に合わせて下さい。
4. コマンド
コマンドは大きく分けて、ifコマンドや
whileコマンドのような「構文コマンド」と、
adddictコマンドやdateコマンドの
ような「関数コマンド」の二つに分類できます。
構文コマンドは与えられた条件の真偽に従い、処理の流れを制御します。一方、
関数コマンドは与えられた引数に従い、実際の処理を行います。
*1
*2
混同する恐れの無い場合、構文コマンドは「構文」、関数コマンドは単に
「コマンド」と呼ぶことがあります。
4.1. コマンド一覧
4.2. コマンドリファレンス
4.2.1. 構文
break
書式 |
$(break)
|
戻り値 |
なし
|
機能 |
loop、until、while、foreach等のループ構文から抜け出す。
|
例
# dataエントリ内の単語を調べ、「END」だったらループから抜ける
$(
setstr @count 0;
loop $(size data) $(
if $[ $data[${@count}] == "END" ] $(
break;
) else $(
inc @count;
);
);
get data[${@count}];
)
|
continue
書式 |
$(continue)
|
戻り値 |
なし
|
機能 |
loop、until、while、foreach等のループ構文中で、
現在のループ処理を終了し、次のループ処理に入る
|
例
# dataエントリの単語で「ゴースト」を含む単語のみdata2エントリにコピー
$(
loop $(size data) $(
setstr @count ${-1};
echo $data[${@count}];
if $[ $data[${@count} !~ "ゴースト" ] $(
continue;
);
pushstr data2 $data[${@count}];
);
)
|
function
書式 |
$(function 関数名 関数の定義)
$(function 関数名)
|
戻り値 |
引数が2つの場合なし
引数が1つの場合、関数定義内容の文字列表現
|
機能 |
関数コマンドを定義する。
関数定義中、@argエントリが引数として使用できる。$@arg[0]は関数名で、
引数は$@arg[1]からとなる。
関数定義全体の戻り値が、関数の戻り値となる。
組み込み関数と同じ名前のコマンド(ただし、構文コマンドは不可)も定義可能。
同名の組み込みコマンドとユーザ定義コマンドが存在した場合、
ユーザ定義コマンドが優先して呼び出される。
その場合、先頭に"."を付けて呼び出すことにより、
元の組み込みコマンドを強制的に呼び出すことができる。
引数が関数名だけだった場合、関数定義の内容の文字列表現が返る。
この戻り値は、関数定義内容をエントリに記述し、
getcodeコマンドでエントリを呼び出した場合と等価である。
|
例
=kis
# エントリにセットした値を戻り値とする関数を定義する
function tset $(
# 引数が2個でなければ何もしない
if $[ $(size @arg) != 3 ] $(return "");
set $@arg[1] $(getcode @arg[2]);
get @arg[2];
);
# ユーザ定義関数tsetの定義を、funcdefエントリに格納
set funcdef $(function tset);
=end
|
if
書式 |
$(if 条件文 真の場合の文)
$(if 条件文 真の場合の文 else 偽の場合の文)
$(if 条件文 真の場合の文 else if 条件文2 …)
|
戻り値 |
真の場合の文、または偽の場合の文の戻り値
|
機能 |
条件文の真偽に応じ、真の場合の文、
または偽の場合の文を実行する。
else if節は何段でもつなげる事ができる。
elseなどのコマンドの前後には必ず空白文字・改行文字が必要。
|
例1
$(if $[ ${mode} == "Y" ] "\h\はい\e" else "\hいいえ\e")
# modeエントリの内容で検索したものが"Y"の場合、「はい」と表示
# それ以外の場合は「いいえ」と表示
例2
$(if "true" $(set a "1" ; set b "2") )
# aエントリの内容は1、bエントリの内容は2になる
# マルチステートメント(複文)を使っている
例3
=dict
a : 1
b : 2
=end
=kis
if $[ ${a} == "1" ] $(
if $[ ${b} == "2"] $(
echo "あたり";
) else $(
echo "はずれ";
);
) else $(
echo "はずれ";
);
=end
# if文の入れ子の例
# 「あたり」と表示される
|
foreach
書式 |
$(foreach エントリ1 エントリ2 文1)
|
戻り値 |
文1をエントリ2内の全単語について評価した結果
|
機能 |
エントリ2内の全単語を順にエントリ1にセットし、そのつど文1を評価する。
文1に置換ブロックを用いる場合には、$()等で囲む。
|
例
$(set N 0 ; foreach i npw $(echo ${i}様、 ; inc N) ; echo 以上${N}名)
# npwエントリ内の人名を全て「様」をつけて呼び、最後に「以上n名」と
# 人数を表示
|
loop
書式 |
$(loop 回数 文1)
|
戻り値 |
文1の戻り値
|
機能 |
指定した回数だけ、文1を繰り返し評価する。
回数、文1に置換ブロックを用いる場合には、$()等で囲む。
|
例
$(loop 10 "tick!")
# 「tick!」と10回表示される
|
return
書式 |
$(return 戻り値)
|
戻り値 |
指定した戻り値
|
機能 |
関数から指定した戻り値で直ちに抜ける。戻り値は省略可能で、
省略した場合、それまでの関数の出力が関数の戻り値となる。
|
例
=kis
function じゃんけん $(
if $[ $@arg[1] == 1 ] $(
return "ぐー";
) else if $[ $@arg[1] == 2 ] $(
return "ちょき";
) else $(
return "ぱー";
);
);
=end
|
rmfunc
書式 |
$(rmfunc ユーザ定義関数名)
|
戻り値 |
なし
|
機能 |
ユーザが定義した関数コマンドを削除する。
|
例
=kis
# my_findコマンドを削除する
rmfunc my_find;
=end
|
silent
書式 |
$(silent)
|
戻り値 |
なし
|
機能 |
マルチステートメント中、silentが登場するまでの戻り値を破棄。
|
例
$(echo 1 ; echo 2 ; silent ; echo 3)
#「3」がブロックの戻り値になる
参考
$(echo 1 ; echo 2 ; echo 3)
#「123」がブロックの戻り値になる
|
until
書式 |
$(until 条件文 文1)
|
戻り値 |
文1の戻り値
|
機能 |
条件文を評価し、結果が偽ならば文1を評価する。
この動作を、条件文の評価結果が偽である間、ずっと繰り返す。
条件文、文1に置換ブロックを用いる場合には、$()等で囲む。
|
例
=kis
setstr A ${npw};
setstr B ${npw};
until $[ ${A} != ${B} ] $(
setstr B ${npw};
);
# AエントリとBエントリが必ず異なるようにする
=end
|
while
書式 |
$(while 条件文 文1)
|
戻り値 |
文1の戻り値
|
機能 |
条件文を評価し、結果が真ならば文1を評価する。
この動作を、条件文の評価結果が真である間、ずっと繰り返す。
条件文、文1に置換ブロックを用いる場合には、$()等で囲む。
|
例
=kis
setstr A ${npw};
setstr B ${npw};
while $[ ${A} == ${B} ] $(
setstr B ${npw};
);
# AエントリとBエントリが必ず異なるようにする
=end
|
NULL
書式 |
$(NULL)
|
戻り値 |
なし(空文字列)
|
機能 |
空文字列を返す。""と同等。
過去互換性とデバッグなどの便宜のために残っている。
|
例
=kis
if $[ ${test1} == $(NULL) ] $(
echo "test1はカラ";
);
=end
# test1が空のエントリ、もしくは評価結果が""の場合、
# 「エントリ1はカラ」を返す
|
?
書式 |
$(? 文1 文2 ... 文n)
|
戻り値 |
文1から文nまでの内どれか一つの戻り値
|
機能 |
文1〜文nから、どれか一つをランダムに選んで評価する。
拡張makotoの代用。
|
例
$(? "右" "左")"に行く"
# 「右に行く」または「左に行く」が返る
|
4.2.2. コマンド-辞書操作
辞書操作コマンド共通事項
|
辞書操作コマンドのうち、単語・文字列セット/追加/挿入コマンド、
get、getcode、clearコマンドは、
共通してエントリを配列として扱う機能がある。これらのコマンドでは、
エントリ名を書く場所で、次のように書くことが出来る。
- 「エントリ1」と書いた場合、エントリ1全体を指す。
- 「エントリ1[0]」と書いた場合、エントリ1の1番目の単語を指す。
- 「エントリ1[0..3]」と書いた場合、
エントリ1の1番目から4番目の単語を指す。
- 「エントリ1[-1]」と書いた場合、エントリ1の末尾の単語を指す。
- 「エントリ1[-2..-4」と書いた場合、
エントリ1の末尾から2番目から、末尾から4番目の単語を指す。
[ ]内はエントリ配列呼び出し同様、0オリジンであることに注意。
また、[ ]内で存在しない添え字を指定した場合、無視する。
なお、上記機能はエントリ配列呼び出しと見た目・機能が似ているが、
まったく無関係の機能であることに注意。
|
例
word : "one" , "two" , "three" , "four" , "five" , "six" , "seven"
=kis
setstr word[4] "5th element";
# wordエントリ5番目の単語を「5th element」で置き換える
setstr word2[0..5] "初期値";
# word2エントリに6個の「初期値」という文字列をセットする
clear word[1];
# wordエントリの2番目の単語(two)を削除
get word;
# 「onethreefour5th elementsixseven」を返す
get word[100];
# wordエントリには6個しか単語がないので、何も返さない
=end
|
adddict
書式 |
$(adddict エントリ1 単語1)
|
戻り値 |
なし
|
機能 |
エントリ1に単語1を追加する。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
=kis
# npwエントリに「田中真紀子」を追加
adddict npw 田中真紀子;
# nameエントリにnpwエントリ中の単語を追加
adddict name ${npw}
# Actエントリに単語「${normal}」を追加
adddict Act "${normal}";
# 次の行を実行すると、normalエントリの中を単語を呼び出す
echo ${Act};
=end
|
adddictstr
書式 |
$(adddictstr エントリ1 文字列1)
|
戻り値 |
なし
|
機能 |
エントリ1に文字列1を追加する。adddictとの違いは、
追加したものが必ず置換ブロックではなく、文字列になる点である。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
=kis
# npwエントリに「田中真紀子」を追加
adddictstr npw 田中真紀子;
# nameエントリにnpwエントリ中の単語を追加
adddictstr name ${npw}
# Actエントリに文字列「${normal}」を追加
adddictstr Act "${normal}";
# 次の行を実行すると、「${normal}」を返す。
echo ${Act};
=end
|
clear
書式 |
$(clear エントリ1)
|
戻り値 |
なし
|
機能 |
エントリ1から単語を削除する。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
test1 : word1, word2, word3
=kis
foreach @word test1 $(echo ${@word})
# 「word1word2word3」を返す
clear test1;
# test1エントリの内容を全て消去
foreach @word test1 $(echo ${@word})
# 何も返さない
=end
|
cleartree
書式 |
$(cleartree エントリ1)
|
戻り値 |
なし
|
機能 |
「エントリ1.」で名前が始まるエントリの内容を全て削除する。
例えば「エントリ1.a」、「エントリ1.b」というエントリがあったとすると、
これらの内容が削除される。
|
例
ghost1.name : まゆら
ghost1.shiori : 華和梨
ghost1.shiori.phase : 7.3.1
ghost1.author : 夢蛍
ghost1.shell : サンタ,着せ替え,白,夏服
=kis
cleartree ghost1;
=end
# 上記エントリの内容は全て削除される
|
copy
書式 |
$(copy エントリ1 エントリ2)
|
戻り値 |
なし
|
機能 |
エントリ1の内容を、すべてエントリ2にコピーする。
エントリ2の以前の内容はそのまま残り、
エントリ1の内容をエントリ2に追加する。
|
例
ghost1 : さくら , まゆら , 奈留 , 理夢 , ${ghost2}
ghost2 : サンバーレイン , 毒子 , 花ちゃん
=kis
copy ghost1 ghost3;
getcode ghost3;
# 「"さくら""まゆら""奈留""理夢"${ghost2}」が返る
size ghost1;
# 5が返る
=end
|
copytree
書式 |
$(copytree エントリ1 エントリ2)
|
戻り値 |
なし
|
機能 |
「エントリ1.」で名前が始まるエントリの構造を、エントリ2にコピーする。
例えば「エントリ1.a」、「エントリ1.b」というエントリがあったとすると、
それぞれの内容を「エントリ2.a」、「エントリ2.b」エントリにコピーする。
|
例
ghost1.name : まゆら
ghost1.shiori : 華和梨
ghost1.shiori.phase : 7.3.1
ghost1.author : 夢蛍
ghost1.shell : サンタ,着せ替え,白,夏服
=kis
copytree ghost1 ghost2;
=end
# 「ghost2.」で始まるエントリの内容が、次のようになる
# ghost2.name : まゆら
# ghost2.shiori : 華和梨
# ghost2.shiori.phase : 7.3.1
# ghost2.author : 夢蛍
# ghost2.shell : サンタ,着せ替え,白,夏服
|
find
書式 |
$(find エントリ1 単語1)
$(find エントリ1 単語1 インデックス)
|
戻り値 |
単語1の位置。見つからなかった場合"-1"。
|
機能 |
エントリ1内で、単語1が現れる最初の位置を返す。
インデックスが指定された場合、そのインデックス以降で、
最後に現れる位置を返す。
インデックスは整数でなければならない。
|
例
地名: ここ, ${人名}の家, 三丁目, ここ, ${人名}の仕事場
候補: ${人名}の家
=kis
find 地名 ここ;
# "0"が返る。
find 地名 ここ 1;
# "3"が返る。
find 地名 "${人名}"の家;
# "1"が返る。
find 地名 $(getcode 候補[0]);
# "1"が返る。
=end
|
get
書式 |
$(get エントリ1)
|
戻り値 |
エントリ1の指定範囲の単語を全て評価した結果
|
機能 |
エントリ1の指定範囲の単語を、添え字昇順で全て評価し、
結果を結合して返す。指定範囲を省略した場合、
エントリ1の全単語が対象となる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
word1 : あ , い , う , え , お
word2 : $(date %y) , $(date %M) , $(date %d)
=kis
get word1;
# 「あいうえお」を返す
get word2;
# 「20020425」の形式で今日の日付を返す
=end
|
getcode
書式 |
$(getcode エントリ1)
|
戻り値 |
エントリ1の指定範囲の単語を全て評価前の形式で結合した結果
|
機能 |
エントリ1の指定範囲の単語を、添え字昇順で全て評価せずに参照し、
結果を結合して返す。指定範囲を省略した場合、
エントリ1の全単語が対象となる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
word1 : あ , い , う , え , お
word2 : $(date %y) , $(date %M) , $(date %d)
=kis
get word1;
# 「"あ""い""う""え""お"」を返す
get word2;
# 「$(date %y)$(date %M)$(date %d)」を返す
=end
|
getrandom
書式 |
$(getrandom エントリ1 単語1)
|
戻り値 |
エントリ1の単語のいずれか、または単語1
|
機能 |
エントリ1の単語をランダムに1つ選択し、評価結果を返す。
エントリ1に単語が無かった場合、単語1を返す。
機能はentryとまったく同じである。
|
例
=kis
getrandom "npw";
# ${npw}と同じ
getrandom "message."$(rand 3);
# ${message.0}から${message.2}のどれかと同じ
getrandom "System.OtherGhost" ${myname};
# ${System.OtherGhost}と同じ
# 結果が空の場合は、${myname}の戻り値が返る
=end
|
insert
書式 |
$(insert エントリ1[インデックス1] 単語1)
|
戻り値 |
なし
|
機能 |
エントリ1の「インデックス1+1」番目の単語の直前に、単語1を挿入する。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
word : 1 , 2 , 3 , 4 , 5 , 6 , 7
key : AAA
=kis
get word;
# 「1234567」が返る
insert word[3] "${key}";
get word;
# 「123AAA4567」が返る
=end
|
insertstr
書式 |
$(insertstr エントリ1[インデックス1] 文字列1)
|
戻り値 |
なし
|
機能 |
エントリ1の「インデックス1+1」番目の単語の直前に、文字列1を挿入する。
insertとの違いは、
追加したものが必ず置換ブロックではなく、文字列になる点である。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
word : 1 , 2 , 3 , 4 , 5 , 6 , 7
key : AAA
=kis
get word;
# 「1234567」が返る
insertstr word[3] "${key}";
get word;
# 「123${key}4567」が返る
=end
|
listsub
書式 |
$(listsub エントリ1 エントリ2)
|
戻り値 |
なし
|
機能 |
「エントリ2.」で名前が始まり、それ以上「.」が含まれないエントリ名の一覧を、エントリ1に追加する。
エントリ2に「.」を指定すると、最上位(「.」を全く含まない)エントリ名の一覧が得られる。
|
例
ghost1.name : まゆら
ghost1.shiori : 華和梨
ghost1.shiori.phase : 7.3.1
ghost1.author : 夢蛍
ghost1.shell : サンタ,着せ替え,白,夏服
=kis
listsub 一覧 ghost1;
getcode 一覧;
# "ghost1.name""ghost1.shiori""ghost1.author""ghsot1.shell"が返る。
|
listtree
書式 |
$(listtree エントリ1 エントリ2)
|
戻り値 |
なし
|
機能 |
「エントリ2.」で名前が始まるエントリ名一覧を、エントリ1に追加する。
エントリ2に「.」を指定すると、全エントリ名一覧を取得できる。
|
例
=kis
listtree SHIORI System.Request;
# SHIORIエントリに、本体からのリクエストヘッダ一覧を追加する
listree Entries .;
# 全エントリ名をEntriesエントリに追加。主に今は亡き対GET Status用
|
move
書式 |
$(move エントリ1 エントリ2)
|
戻り値 |
なし
|
機能 |
エントリ1の内容を、すべてエントリ2に移す。
実行後、エントリ1の内容は削除される。
エントリ2の以前の内容はそのまま残り、
エントリ1の内容をエントリ2に追加する。
|
例
ghost1 : さくら , まゆら , 奈留 , 理夢 , ${ghost2}
ghost2 : サンバーレイン , 毒子 , 花ちゃん
=kis
move ghost1 ghost3;
getcode ghost3;
# 「"さくら""まゆら""奈留""理夢"${ghost2}」が返る
size ghost1;
# 0が返る
=end
|
movetree
書式 |
$(movetree エントリ1 エントリ2)
|
戻り値 |
なし
|
機能 |
「エントリ1.」で名前が始まるエントリの構造を、エントリ2に移す。
例えば「エントリ1.a」、「エントリ1.b」というエントリがあったとすると、
それぞれの内容を「エントリ2.a」、「エントリ2.b」エントリにコピーする。
その後エントリ1.a、エントリ1.b等を削除する。
|
例
ghost1.name : まゆら
ghost1.shiori : 華和梨
ghost1.shiori.phase : 7.3.1
ghost1.author : 夢蛍
ghost1.shell : サンタ,着せ替え,白,夏服
=kis
movetree ghost1 ghost2;
=end
# 「ghost2.」で始まるエントリの内容が、次のようになる
# ghost2.name : まゆら
# ghost2.shiori : 華和梨
# ghost2.shiori.phase : 7.3.1
# ghost2.author : 夢蛍
# ghost2.shell : サンタ,着せ替え,白,夏服
|
pop
書式 |
$(pop エントリ1)
|
戻り値 |
エントリ1の末尾の単語
|
機能 |
エントリ1の末尾にある単語を削除し、それを返す。
エントリ1に単語が無ければ、空文字列を返す。
|
例
PASOPIA : パソピア7
oldmachine : PC9801,X68k,MSX2,PC8801,X1,PC8001,${PASOPIA}
=kis
foreach @pc oldmachine $(echo " "${@pc});
# 「 PC9801 X68k MSX2 PC8801 X1 PC8001 パソピア7」を返す
pop oldmachine;
# 「パソピア7」を返す
foreach @pc oldmachine $(echo " "${@pc});
# 「 PC9801 X68k MSX2 PC8801 X1 PC8001」を返す
=end
|
popcode
書式 |
$(popcode エントリ1)
|
戻り値 |
エントリ1の末尾の単語の評価前の形式
|
機能 |
エントリ1の末尾にある単語を削除し、評価前の形式で返す。
エントリ1に単語が無ければ、空文字列を返す。
|
例
PASOPIA : パソピア7
oldmachine : PC9801,X68k,MSX2,PC8801,X1,PC8001,${PASOPIA}
=kis
foreach @pc oldmachine $(echo " "${@pc});
# 「 PC9801 X68k MSX2 PC8801 X1 PC8001 パソピア7」を返す
popcode oldmachine;
# 「${PASOPIA}」を返す
foreach @pc oldmachine $(echo " "${@pc});
# 「 PC9801 X68k MSX2 PC8801 X1 PC8001」を返す
=end
|
push
書式 |
$(push エントリ1 単語1)
|
戻り値 |
なし
|
機能 |
エントリ1の末尾に単語1を追加する。adddictと同義。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
=kis
# npwエントリに「田中真紀子」を追加
push npw 田中真紀子;
# nameエントリにnpwエントリ中の単語を追加
push name ${npw}
# Actエントリに単語「${normal}」を追加
push Act "${normal}";
# 次の行を実行すると、normalエントリの中を単語を呼び出す
echo ${Act};
=end
|
pushstr
書式 |
$(pushstr エントリ1 文字列1)
|
戻り値 |
なし
|
機能 |
エントリ1の末尾に文字列1を追加する。adddictstrと同義。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
=kis
# npwエントリに「田中真紀子」を追加
pushstr npw 田中真紀子;
# nameエントリにnpwエントリ中の単語を追加
pushstr name ${npw}
# Actエントリに文字列「${normal}」を追加
pushstr Act "${normal}";
# 次の行を実行すると、「${normal}」を返す。
echo ${Act};
=end
|
rfind
書式 |
$(rfind エントリ1 単語1)
$(rfind エントリ1 単語1 インデックス)
|
戻り値 |
単語1の位置。見つからなかった場合"-1"。
|
機能 |
エントリ1内で、単語1が現れる最後の位置を返す。
インデックスが指定された場合、そのインデックス以前で、
最後に現れる位置を返す。
インデックスは整数でなければならない。
|
例
地名: ここ, ${人名}の家, 三丁目, ここ, ${人名}の仕事場
候補: ${人名}の家
=kis
rfind 地名 ここ;
# "3"が返る。
rind 地名 ここ 2;
# "0"が返る。
rfind 地名 "${人名}"の家;
# "1"が返る。
rfind 地名 $(getcode 候補[0]);
# "1"が返る。
=end
|
set
書式 |
$(set エントリ1 単語1)
|
戻り値 |
なし
|
機能 |
エントリ1の内容を削除してから、単語1を登録する。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
dummy : 1
angry : 怒ってるゾ!
=kis
set mode 1;
# modeエントリの内容は「1」だけになる
set mody ${dummy};
# modeエントリの内容は${dummy}=「1」になる
set emotion "${angry}";
# emotionエントリの内容は単語「${angry}」になる
echo ${emotion};
# 「怒ってるゾ!」を返す
=end
|
setstr
書式 |
$(setstr エントリ1 文字列1)
|
戻り値 |
なし
|
機能 |
エントリ1の内容を削除してから、文字列1を登録する。
setとの違いは、
追加したものが必ず置換ブロックではなく、文字列になる点である。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
dummy : 1
angry : 怒ってるゾ!
=kis
setstr mode 1;
# modeエントリの内容は「1」だけになる
setstr mody ${dummy};
# modeエントリの内容は${dummy}=「1」になる
setstr emotion "${angry}";
# emotionエントリの内容は文字列「${angry}」になる
echo ${emotion};
# 「${angry}」を返す
=end
|
shift
書式 |
$(shift エントリ1)
|
戻り値 |
エントリ1の先頭にある単語
|
機能 |
エントリ1の先頭にある単語を一つ削除し、それを返す。
エントリ1に単語が無ければ、空文字列を返す。
|
例
counter : 1, 2, 3, 4, 5
sentence : \hこの文が呼ばれるのは$(shift counter)回目だね。\e
|
shiftcode
書式 |
$(shiftcode エントリ1)
|
戻り値 |
エントリ1の先頭にある単語の評価前の形式
|
機能 |
エントリ1の先頭にある単語を一つ削除し、評価前の形式で返す。
エントリ1に単語が無ければ、空文字列を返す。
|
例
counter : 1, 2, 3, 4, 5
sentence : \hこの文が呼ばれるのは$(shiftcode counter)回目だね。\e
|
size
書式 |
$(size エントリ1)
|
戻り値 |
単語数
|
機能 |
エントリ1中の単語数を返す。
|
例
理夢 : 理夢
ninni.angels,famous.ghosts : 奈留, せりこ, まゆら, ${理夢}
dark.sisters,famous.ghosts : 毒子, 花ちゃん, サンバーレイン, ${理夢}
=kis
size dark.sisters;
# 4が返る
size famous.ghosts;
# 8が返る
=end
|
unshift
書式 |
$(unshift エントリ1 単語1)
|
戻り値 |
なし
|
機能 |
エントリ1の先頭に単語1を挿入する。
|
例
ghosts : まゆら,理夢,毒子,白子,美耳,陽子
任意 : さくら
=kis
get ghosts;
# 「まゆら理夢毒子白子美耳陽子」を返す
unshift ghosts "${任意}";
get ghosts;
# 「さくらまゆら理夢毒子白子美耳陽子」を返す
=end
|
unshiftstr
書式 |
$(unshiftstr エントリ1 文字列1)
|
戻り値 |
なし
|
機能 |
エントリ1の先頭に文字列1を挿入する。
unshiftとの違いは、
追加したものが必ず置換ブロックではなく、文字列になる点である。
|
例
ghosts : まゆら,理夢,毒子,白子,美耳,陽子
任意 : さくら
=kis
get ghosts;
# 「まゆら理夢毒子白子美耳陽子」を返す
unshift ghosts "${任意}";
get ghosts;
# 「${任意}まゆら理夢毒子白子美耳陽子」を返す
=end
|
writeprotect
書式 |
$(writeprotect エントリ1)
|
戻り値 |
なし
|
機能 |
エントリ1を(起動中)書き込み不可にする。
従来resource.homeurlなどはシステム側でプロテクトしていたが、
Phase 8では重要情報がどこに書かれるか分からないため、
ユーザやミドルウェアが自分でプロテクトをかけられるようにした。
プロテクトを外すコマンドは存在しない。
プロテクトされたエントリに書き込もうとした場合、Errorレベルのログが出力される。
|
例
username : ご主人様
=kis
writeprotect username;
=end
|
4.2.3. コマンド-ファイル操作
cncpath
書式 |
$(cncpath パス名)
$(cncpath パス名 ファイル名)
|
戻り値 |
正規化したパス名
|
機能 |
パス区切り記号に'/'と'\'が混在したパス名を、
実装したファイルシステムで適切なパス区切り記号に変換して返す。
ファイル名も指定した場合、パスと適切な形で結合して、
同じように適切なパス区切り記号で返す。
パスとして解釈できない場合、何も返さない。
|
例
=kis
# ここではMS Windows上のオリジナル華和梨を想定している
# "..\..\unix"が返る
cncpath ../../unix;
# "C:\WINDOWS\SYSTEM"が返る
cncpath C:/WINDOWS\SYSTEM
# "..\..\UNIX\LS.EXE"が返る
cncpath ../../UNIX/ LS.EXE
=end
|
dirname
書式 |
$(dirname パス名)
|
戻り値 |
正規化したディレクトリ名
|
機能 |
与えられたパス名をcncpathで正規化し、
ディレクトリ名部分を抽出して返す。
|
例
=kis
# ここではMS Windows上のオリジナル華和梨を想定している
# "C:\Program Files\Microsoft Office\Office"が返る
dirname "C:/Program Files/Microsoft Office/Office/POWERPNT.EXE"
=end
|
filename
書式 |
$(filename パス名)
|
戻り値 |
ファイル名
|
機能 |
与えられたパス名をcncpathで正規化し、
ファイル名部分を抽出して返す。
|
例
=kis
# ここではMS Windows上のオリジナル華和梨を想定している
# "POWERPNT.EXE"が返る
filename "C:/Program Files/Microsoft Office/Office/POWERPNT.EXE"
=end
|
isdir
書式 |
$(isdir パス名)
|
戻り値 |
パスがディレクトリならば真、そうでなければ偽
|
機能 |
与えられたパス名がディレクトリかどうか判定する。
パスがディレクトリならば真、そうでなければ偽を返す。
パスのファイルが存在しない場合の動作は不定である。
|
例
=kis
# MATERIAのghost\masterフォルダで実行した場合を想定
isdir $(cncpath profile);
# 1が返る
isdir shiori.dll;
# ""が返る
=end
|
isexist
書式 |
$(isexist パス名)
|
戻り値 |
パスが存在すれば真、そうでなければ偽
|
機能 |
与えられたパス名が存在するかどうか判定する。
パスが存在すれば真、そうでなければ偽を返す。
|
例
=kis
# MATERIAのghost\masterフォルダで実行した場合を想定
isexist $(cncpath profile);
# 1が返る
isexist shiori.dll;
# 1が返る
isexist $(cncpath ..\..\..\..\embryo.exe);
# ""が返る
=end
|
isfile
書式 |
$(isfile パス名)
|
戻り値 |
パスが通常ファイルならば真、そうでなければ偽
|
機能 |
与えられたパス名が通常ファイルかどうか判定する。
パスが通常ファイルならば真、そうでなければ偽を返す。
パスのファイルが存在しない場合の動作は不定である。
|
例
=kis
# MATERIAのghost\masterフォルダで実行した場合を想定
isfile $(cncpath profile);
# ""が返る
isfile shiori.dll;
# 1が返る
=end
|
load
書式 |
$(load ファイル名)
|
戻り値 |
なし
|
機能 |
華和梨辞書形式ファイルを読み込む。暗号化辞書も可。
ファイル名の先頭が「/」「\」またはドライブ名から始まる場合には
絶対パスとみなし、それ以外の場合にはゴーストのディレクトリからの
相対パスとみなす。
|
例
=kis
load dict-flag.txt;
# dict-flag.txtを読み込む
=end
|
readdir
書式 |
$(readdir エントリ1 ディレクトリ)
|
戻り値 |
なし
|
機能 |
指定ディレクトリに含まれるファイル・ディレクトリ名を
エントリ1に保存する。エントリ1の以前の内容は消去される。
ディレクトリ名は相対パスも可。カレントディレクトリの'.'、
親ディレクトリの'..'は予め削除される。
|
例
=kis
readdir shell "..\..\shell";
# 自ゴーストで使用できるシェル一覧をshellに保存
=end
|
save
書式 |
$(save ファイル名 エントリ名1 ... )
|
戻り値 |
なし
|
機能 |
ファイルにエントリ内容を華和梨辞書形式でセーブする。
指定ファイルの以前の内容は消去し、
指定エントリ群の内容でファイルを上書きする。
|
例
=kis
save dict-flag.txt flag1 flag2 flag3;
# flag1、flag2、flag3エントリをdict-flag.txtに保存
=end
|
savecrypt
書式 |
$(savecrypt ファイル名 エントリ名1 ... )
|
戻り値 |
なし
|
機能 |
ファイルにエントリ内容を暗号化華和梨辞書形式でセーブする。
指定ファイルの以前の内容は消去し、
指定エントリ群の内容でファイルを上書きする。
|
例
=kis
savecrypt dict-flag.txt flag1 flag2 flag3;
# flag1、flag2、flag3エントリをdict-flag.txtに暗号化して保存
=end
|
textappend
書式 |
$(textappend ファイル名 エントリ1 [エントリ2..])
|
戻り値 |
なし
|
機能 |
エントリ1、エントリ2…の全ての内容を、テキストファイル1に追記する。
セキュリティの観点から、書き出すファイル名は相対パスのみである。
エントリの内容は、添え字順に評価してその結果を書き出す。
ファイルに書き出す際、添え字ごとに最後に改行する。
textsaveとの違いは、テキストファイル1の以前の内容が残る点である。
|
例
=kis
textappend highscore.dat 新タイトル保持者名;
# highscore.datに、「新タイトル保持者名」エントリの内容を追記
=end
|
textload
書式 |
$(textload エントリ1 テキストファイル1)
|
戻り値 |
なし
|
機能 |
テキストファイル1の内容を読み込む。
ファイルの1行目はエントリ1の一つ目の単語、
2行目はエントリ1の二つ目の単語となる。
行末の改行コードは、削除してからエントリに格納する。
|
例
=kis
textload poem mypoem.txt;
# poemエントリにファイル'mypoem.txt'を読み込む
echo \0$(set @i 0 ; loop $(size poem) $(get poem[${@i}] ; inc @i))\e;
# ファイルmypoem.txtの内容を読み込み、さくら側バルーンで内容を表示する
=end
|
textsave
書式 |
$(textsave ファイル名 エントリ1 [エントリ2..])
|
戻り値 |
なし
|
機能 |
エントリ1、エントリ2…の全ての内容を、テキストファイル1に書き出す。
セキュリティの観点から、書き出すファイル名は相対パスのみである。
エントリの内容は、添え字順に評価してその結果を書き出す。
ファイルに書き出す際、添え字ごとに最後に改行する。
textappendとの違いは、テキストファイル1の以前の内容が残らない点である。
|
例
=kis
textsave highscore.dat タイトル保持者名一覧;
# highscore.datに、「タイトル保持者名一覧」エントリの内容を保存
=end
|
4.2.4. コマンド-カウンタ
dec
書式 |
$(dec エントリ1 減分 下限)
|
戻り値 |
なし
|
機能 |
エントリ1を減分だけ減算する。減分と下限は省略可能。
減分を省略した場合、1と見なす。
減算した結果が下限より小さくなった場合、エントリ1の内容は下限となる。
下限を省略するといつまでも減算できる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
=kis
dec N;
# Nを1だけ減らす
dec N 5;
# Nを5だけ減らす
dec N 10 0;
# Nを10だけ減らし、結果が0より小さければNは0とする
dec N[0];
# N[0]を1だけ減らす
dec N[0..3] 2 0;
# N[0]からN[3]までをそれぞれ2だけ減らし、結果が0より小さければ0とする
=end
|
inc
書式 |
$(inc エントリ1 増分 上限)
|
戻り値 |
なし
|
機能 |
エントリ1を増分だけ加算する。増分と上限は省略可能。
増分を省略した場合、1と見なす。
加算した結果が上限より大きくなった場合、エントリ1の内容は上限となる。
上限を省略するといつまでも加算できる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
=kis
inc N;
# Nを1だけ増やす
inc N 5;
# Nを5だけ増やす
inc N 10 100;
# Nを10だけ増やし、結果が100より大きければNは100とする
inc N[2] 4;
# N[2]を4だけ増やす
inc N[1..-1] 2 100;
# N[0]以外のNをそれぞれ2だけ増やし、結果が100より大きければ100とする
=end
|
4.2.5. 文字列操作
char_at
書式 |
$(char_at 文字列1 インデックス)
|
戻り値 |
文字列1の「インデックス+1」文字目の文字
|
機能 |
指定文字列の指定した場所の1文字を返す。
マルチバイト文字も1文字と数える。
インデックスは0オリジンであることに注意。
|
例
=kis
char_at 世界よ、こんにちは。 2;
# 「よ」が返る
=end
|
chr
書式 |
$(chr 文字コード)
|
戻り値 |
指定した文字コードの一文字
|
機能 |
指定した文字コードの一文字を返す。
|
例
=kis
chr 1;
# いわゆる「バイト値1」が返る
chr 2;
# いわゆる「バイト値2」が返る
=end
|
compare
書式 |
$(compare 文字列1 文字列2)
|
戻り値 |
-1、0、1のいずれか
|
機能 |
文字列同士を辞書順序で比較する。
文字列1が文字列2より辞書順で後ならば1、
文字列1が文字列2より辞書順で前ならば-1、
文字列1と文字列2が等しければ0を返す。
|
例
dict : a , aa , b , c , xa , xy , z
word : hello
=kis
setstr @count 0;
loop $(size dict) $(
if $[ $(compare $dict[${@count}] ${word}) < 1 ] $(
inc @count;
) else $(
break;
);
);
insertstr dict[${@count}] ${word};
# compareを使った大小比較の例
# 辞書順にソートしたエントリに対し、添え字0から${word}と比較し、
# ${word}より大きな単語の直前に${word}を挿入している
=end
|
gsub
書式 |
$(gsub 文字列1 パターン 置換文字列)
|
戻り値 |
置換後の文字列
|
機能 |
指定文字列中に指定パターンがあった場合、置換文字列で置き換える。
subとの違いは、指定文字列中に指定パターンが複数あった場合、
全て置換する点である。
|
例
=kis
gsub hogehogehoge ge ro;
# 「horohorohoro」が返る
=end
|
join
書式 |
$(join エントリ1 区切り文字)
|
戻り値 |
結合後の文字列
|
機能 |
エントリ1の内容を、区切り文字を間に挟んで順に結合して返す。
結合の際、エントリ1の内容は順に評価される。
区切り文字は省略可能で、省略した場合はヌル文字「""」をした場合と同じ。
|
例
path : WINDOWS, SYSTEM32, drivers, etc
=kis
join path "\\";
# 「WINDOWS\SYSTEM32\drivers\etc」が返る
=end
|
length
書式 |
$(length 文字列1)
|
戻り値 |
文字列1の長さ
|
機能 |
指定文字列の長さを返す。
マルチバイト文字1字も長さ1である。
|
例
=kis
length とても長くてすぐには何文字か分からない1byte文字も交えた例;
# 31が返る
=end
|
match
書式 |
$(match 文字列1 パターン インデックス)
|
戻り値 |
パターンの文字列1の中における先頭位置
|
機能 |
指定文字列中に指定パターンがあった場合、その先頭の位置を返す。
インデックスは省略可能で、指定した場合、
指定文字列の「インデックス+1」文字目から検索を始める。
省略した場合、指定文字列の先頭から検索を始める。
戻り値は0オリジンで、パターンが存在しなかった場合、
-1を返す。
|
例
=kis
match 芝村をやっている 村を;
# 1が返る
match あーりーあーもー殺ーるーのー あー 2;
# 4が返る
match 我は、我である。 ジャム;
# -1が返る
=end
|
match_at
書式 |
$(match_at 文字列1 パターン インデックス)
|
戻り値 |
パターンがあれば1、なければ""
|
機能 |
文字列中のインデックス番目(0オリジン)にパターンが存在すれば1。
存在しなければ""を返す。
指定省略時のインデックスは0.
|
例
=kis
match_at 芝村をやっている 村を;
# ""が返る
match_at 芝村をやっている 村を 1;
# 1が返る
match_at あーりーあーもー殺ーるーのー あー 4;
# 1が返る
match_at 我は、我である。 ジャム;
# ""が返る
=end
|
reverse
書式 |
$(reverse 文字列1)
|
戻り値 |
前後が逆になった文字列
|
機能 |
文字列の前後を入れ替える。
バイト単位ではなく、文字単位で入れ替えることに注意。
|
例
=kis
reverse 上から読んでも山本山
# 「山本山もでん読らか上」が返る
=end
|
rmatch
書式 |
$(rmatch 文字列1 パターン インデックス)
|
戻り値 |
パターンの文字列1の中における先頭位置
|
機能 |
指定文字列中に指定パターンがあった場合、その先頭の位置を返す。
インデックスは省略可能で、指定した場合、
指定文字列の「インデックス+1」文字目から、前方に向けて検索を始める。
省略した場合、指定文字列の最後尾から前方に向けて検索を始める。
戻り値は0オリジンで、パターンが存在しなかった場合、
-1を返す。
|
例
=kis
rmatch 芝村をやっている 村を;
# 1が返る
rmatch あーりーあーもー殺ーるーのー あー 2;
# 0が返る
rmatch 我は、我である。 ジャム;
# -1が返る
=end
|
rsub
書式 |
$(rsub 文字列1 パターン 置換文字列)
|
戻り値 |
置換後の文字列
|
機能 |
指定文字列中に指定パターンがあった場合、置換文字列で置き換える。
gsubとの違いは、指定文字列中に指定パターンが複数あった場合、
最後尾の1つだけ置換する点である。
|
例
=kis
rsub hogehogehoge ge ro;
# 「hogehogehoro」が返る
=end
|
split
書式 |
$(split エントリ1 文字列1 区切り文字列1)
|
戻り値 |
なし
|
機能 |
文字列1を区切り文字列1で分割し、エントリ1に格納する。
エントリ1の以前の内容はそのまま残り、
新たに格納される文は、エントリ1にpushされる。
区切り文字1は省略可能で、
省略した場合は文字列1を文字ごとに分割する。
|
例
=kis
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に分割
split char "世界よ、こんにちは!";
# "世界よ、こんにちは!"を文字ごとに分割
=end
|
sub
書式 |
$(sub 文字列1 パターン 置換文字列)
|
戻り値 |
置換後の文字列
|
機能 |
指定文字列中に指定パターンがあった場合、置換文字列で置き換える。
gsubとの違いは、指定文字列中に指定パターンが複数あった場合、
先頭の1つだけ置換する点である。
|
例
=kis
sub hogehogehoge ge ro;
# 「horohogehoge」が返る
=end
|
substr
書式 |
$(substr 文字列1 開始位置 長さ)
|
戻り値 |
部分文字列
|
機能 |
文字列1の部分文字列を返す。文字列1の「開始位置+1」文字目から、
「長さ」文字分を返す。位置は0オリジンである。
長さは省略でき、省略した場合、
開始位置から末尾までを返す。
位置が負の数の場合、末尾から数えた位置になる。
|
例
=kis
substr ABCDEFG 3 2;
# 「DE」を返す
substr ABCDEFG 3;
# 「DEFG」を返す
=end
|
tolower
書式 |
$(tolower 文字列1 ...)
|
戻り値 |
文字列中のアルファベット大文字を小文字に置換した結果
|
機能 |
文字列中のアルファベット大文字を小文字に置換する。
半角文字のみに作用する。
|
例
=kis
tolower ABC def;
# 「abc def」が返る
tolower XYZ XYZ;
# 「XYZ xyz」が返る
=end
|
toupper
書式 |
$(toupper 文字列1 ...)
|
戻り値 |
文字列中のアルファベット小文字を大文字に置換した結果
|
機能 |
文字列中のアルファベット小文字を大文字に置換する。
半角文字のみに作用する。
|
例
=kis
toupper ABC def;
# 「ABC DEF」が返る
toupper xyz xyz;
# 「xyz XYZ」が返る
=end
|
tr
書式 |
$(tr 文字列1 置換対象文字 変換文字)
|
戻り値 |
置換後の文字列
|
機能 |
指定文字列中に置換対象文字のいずれかがあった場合、
対応する変換文字に置き換える。
変換文字に対応する部分がない場合、""に置き換える。
perlのtr//dと同じ動作をする。
|
例
=kis
tr AbCdあいう ABCDABCDabcd abcdwxyz1234;
# 「aby4あいう」が返る
=end
|
4.2.6. コマンド-SAORI
saoriregist
書式 |
$(saoriregist DLLファイル エイリアス [ オプション ] )
|
戻り値 |
なし
|
機能 |
SAORIモジュールの登録。
DLLファイルには、相対パスまたは絶対パスでDLLを指定する。
エイリアスは、callsaoriコマンドでSAORIモジュールを呼ぶ際のキーワードを指定する。
オプションには、SAORIモジュールをロードするタイミングを指定する。
SAORIの中にはロードに時間のかかるものや、
呼ばれない可能性があることも考えられるため、
このような調整が可能となっている。
タイミングには"preload", "loadoncall", "noresident"
の3種類があり、
それぞれ、「saoriregist時にロード」「最初にcallsaori(x)された時にロード」
「callsaori時にロードし、終わったら即アンロード」を意味する。
デフォルトはloadoncallである。
|
例
=kis
# saori_cpuid.dllをcpuidとして登録。今すぐロード。
saoriregist modules\saori_cpuid.dll cpuid preload
=end
|
saorierase
書式 |
$(saorierase エイリアス)
|
戻り値 |
なし
|
機能 |
登録済みのSAORIを登録から抹消する。
ロードされていたら併せてアンロードされる。
|
例
=kis
# cpuidをアンロード
saorierase cpuid;
=end
|
saorilist
書式 |
$(saorilist エントリ1)
|
戻り値 |
なし
|
機能 |
登録済みのSAORIのエイリアスを、すべてエントリ1に格納する。
オプションの種類によらず、登録しているエイリアスを全て返すことに注意。
|
例
=kis
# System.SaoriListエントリに登録済SAORIエイリアスの一覧を格納
saorilist System.SaoriList;
=end
|
callsaori
書式 |
callsaori エイリアス [ 引数 引数 ... ]
|
戻り値 |
SAORIの戻り値(Result)
|
機能 |
戻り値が一つのSAORIを呼び出す。
|
例
sentence : \0\s[0]ここのOSは$(callsaori cpuid os.name)ね。\e
|
callsaorix
書式 |
callsaorix エイリアス 戻り値格納エントリ [ 引数 引数 ... ]
|
戻り値 |
SAORI呼び出し結果(Result)
|
機能 |
複数の戻り値を持つSAORIを呼び出し、結果を得る。
SAORIの戻り値はValue[数値]ヘッダに格納されているが、
これを、「指定エントリ.Value[数値]」
エントリに格納する。
また、「指定エントリ.size」
に、得られた戻り値(Value)の数を返す。
|
例
# tmizu氏作のwmove.dllを使い、キャラクタの立ち位置を取得する
=kis
fuction getposition $(
# 引数1 : 0=Sakura、1=Kero
# 引数2 : 戻り値返却用エントリ名
if $[ $@arg[1] == 0 ] $(
setstr @characterHWnd $System.HWnd.shell[0];
) else if $[ $@arg[1] == 1 ] $(
setstr @characterHWnd $System.HWnd.shell[1];
) else $(
return "";
);
callsaorix wmove $@arg[2] GET_POSITION ${@characterHWnd};
);
=end
|
4.2.7. コマンド-コミュニケート機能
communicate
書式 |
$(communicate エントリ1 単語1)
|
戻り値 |
エントリ1の示すエントリの単語、もしくは単語1
|
機能 |
エントリ1の単語を全て評価し、戻り値があった単語をランダムに1個選び、
これをエントリ名と見なしてエントリ呼び出しの結果を返す。
戻り値のあった単語が1つも無い場合、単語1を返す。
単語1は省略可能。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
毒子.keyword1 : うむ , ふはははは , 変態
毒子.answer1 : \t\0\s[7]胸のことは言うなっ!\e
毒子.answer1 : \t\0\s[1]…。\e
花ちゃん.keyword1 : どないしたんや , 同じ中学生なのに
花ちゃん.answer1 : \t\0\s[8]あ‥‥\w8あまりじろじろ見んといてな。\e
花ちゃん.answer1 : \t\0\s[1]花ちゃんかて…。\e
match_keys : $(
if $[ ${System.Request.Reference0} == "毒子" ] $(
if $(xargs 毒子.keyword1 matchall ${System.Request.Reference1})
毒子.answer1
)
)
match_keys : $(
if $[ ${System.Request.Reference0} == "花ちゃん" ] $(
if $(xargs 花ちゃん.keyword1 matchall ${System.Request.Reference1})
花ちゃん.answer1
)
)
event.OnCommunicate : $(communicate match_keys ${communicate.else})
# コミュニケートコマンド群を用いたコミュニケートの実装例
# OnCommunicateイベントでcommunicateコマンドを使い、イベント反応を
# 記述したmatch_keysエントリを全て評価、戻り値のうち一つを選ぶ
# そして、戻り値をエントリ名と見なしてエントリ呼び出しを行い、それを返す
# 何も無い場合、communicate.elseエントリの単語を返す
|
matchall
書式 |
$(matchall 文字列1 キーワード1 ...)
|
戻り値 |
真または偽
|
機能 |
キーワードが全て文字列1にあった場合、真を返す。
キーワードは1個以上ならば、いくつでも列挙できる。
|
例
毒子.keyword1 : あらあら , 最近 , 中学生 , 乳
=kis
matchall ${System.Request.Reference1} こんにちは;
# Reference1に「こんにちは」が含まれる場合、真を返す
matchall ${System.Request.Reference1} うにゅう おいしい ?;
# Reference1に「うにゅう」「おいしい」「?」が含まれる場合、真を返す
# 例えば「うにゅうっておいしいの?」と言う文章がきた場合、真を返す
xargs 毒子.keyword1 matchall ${System.Request.Reference1};
# xargsとの合わせ技
# xargsで毒子.keyword1エントリの単語を「matchall..」以降に列挙
# 結果として、毒子.keyword1エントリの単語がすべてReference1に含まれる
# 場合、真を返す
=end
|
4.2.8. コマンド-出力
echo
書式 |
$(echo 単語1 ...)
|
戻り値 |
全引数を空白文字で接続したもの
|
機能 |
与えられた全引数を、空白文字で区切って返す。
|
例
=kis
echo 1 2 3 4 5;
# 「1 2 3 4 5」が返る
setstr test1 "TEST";
echo ${test1};
# 「TEST」が返る
=end
|
encode_entryname
書式 |
$(encode_entryname 文字列1)
|
戻り値 |
エントリ名に使用できる文字に変換した文字列
|
機能 |
指定文字列中のエントリ名に使用できない文字を変換し、
エントリ名に使用できる文字列を返す。
使用できない文字は、"_"に変換する。
エントリ名に使用できない文字については、
KIS Programming Reference の「3.華和梨文法」を参照のこと。
|
例
=kis
encode_entryname "「#」や「,」や「 」はエントリ名に使えません";
# "「_」や「_」や「_」はエントリ名に使えません"が返る。
=end
|
escape
書式 |
$(escape 単語1 ...)
|
戻り値 |
全引数を空白文字で接続し、「\」を「\\」に、「%」を「\%」に置換したもの
|
機能 |
与えられた全引数のさくらスクリプトをエスケープする。
|
例
event.OnFileDropped : (
$(escape ${System.Request.Reference0})
がドロップされました。)
# ドラッグ&ドロップされたファイル名を表示する
|
4.2.9. コマンド-補助機能
entry
書式 |
$(entry エントリ名 単語1)
|
戻り値 |
${エントリ名}の結果、または単語1
|
機能 |
エントリからランダムに単語を選び、評価する。
指定したエントリが空の場合、単語1を返す。
単語1は省略可能。省略した時に指定したエントリが空の場合、
空文字を返す。
evalでも同様のことが可能だが、entryの方が負荷が軽い。
|
例
=kis
entry "npw";
# ${npw}と同じ
entry "message."$(rand 3);
# ${message.0}から${message.2}のどれか
entry "system.OtherGhost" ${myname};
# ${system.OtherGhost}と同じ
# 空の場合は${myname}の戻り値が返る
=end
|
entrycount
書式 |
$(entrycount)
|
戻り値 |
エントリの総数
|
機能 |
エントリの総数を返す。主にAIグラフに使用する。
|
例
$(entrycount)
|
eval
書式 |
$(eval 単語1 ...)
|
戻り値 |
デコード結果
|
機能 |
与えられた全引数中の${}、$()等を再度再帰的に評価し、
展開結果を返す。再帰的評価を行う以外はechoと同じ。
|
例
kawari : 華和梨
nise : 偽
shiori : 栞
niseshiori : ${nise}${shiori}
=kis
eval "理夢の偽AIは${kawari}です";
# 「理夢の偽AIは華和梨です」が返る
eval "奈留の偽AIは${niseshiori}です";
# 「奈留の偽AIは偽栞です」が返る
=end
参考
=kis
echo "奈留の偽AIは${niseshiori}です";
# 「奈留の偽AIは${niseshiori}です」が返る
=end
|
urllist
書式 |
$(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を与える必要がある
|
wordcount
書式 |
$(wordcount)
|
戻り値 |
単語の総数
|
機能 |
単語の総数を返す。主にAIグラフに使用する。
|
例
$(wordcount)
|
xargs
書式 |
$(xargs 引数エントリ コマンド1 ...)
|
戻り値 |
コマンド1の実行結果
|
機能 |
引数エントリの内容を添え字順に展開して、コマンド1の引数として与える。
コマンド1の後に書いた引数は、
引数エントリの展開内容より前方に付加する。
コマンド1の実行結果が戻り値となる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
|
例
SaveEntries : HighScore , Life , 喋り頻度 , 好感度 , 最終更新日
RecommendSites : "伺か" , "http://sakura.mikage.to" , "-"
RecommendSites : "まゆら" , "http://mayura.jp/" , "-"
RecommendSites : "-" , "-" , "-"
RecommendSites : "華和梨" , "http://kawari.sf.net/" , "-"
keyword1 : 華和梨 , SHIORI , ゴースト
=kis
xargs SaveEntries save parameter.txt;
# SaveEntriesの内容を展開してsaveコマンドを実行。
# 「save parameter.txt HighScore Lige 喋り頻度 好感度 最終更新日」
# を実行した場合と等価。
xargs RecommendSites urllist;
# urllistコマンドにRecommendSitesエントリの内容を展開して与える
xargs keyword1 matchall ${System.Request.Reference0};
# keyword1エントリの全ての単語がReference0にマッチしたら真を返す
=end
|
4.2.10. コマンド-その他
date
書式 |
$(date 書式文字列1 経過秒数1)
|
戻り値 |
日時の文字列
|
機能 |
経過秒数1を1970/1/1 0:00:00からの経過秒数と考え、
書式文字列1に従って、日時の情報を返す。
経過秒数1は省略可能で、省略すると現時刻を指定したことになる。
書式文字列には以下が使える。
%d | : 日(2桁,01..31) |
%e | : 日(1..31) |
%H | : 時(2桁,00..23) |
%j | : 元日からの通算日(3桁,001..366) |
%J | : 元日からの通算日(1..366) |
%k | : 時(0..23) |
%m | : 月(2桁,01..12) |
%M | : 分(2桁,00..59) |
%n | : 月(1..12) |
%N | : 分(0..59) |
%r | : 秒(0..59) |
%S | : 秒(2桁,00..59) |
%s | : 1970/1/1 00:00:00(協定時)からの通算秒数 |
%w | : 曜日(0..6,日曜日が0) |
%y | : 年(4桁,2000...) |
%Y | : 年(4桁,2000...) |
'%'で始まるマクロ以外の文字は、そのまま表示する。
また、書式文字列を省略した場合、
「%y/%m/%d %H:%M:%S」をセットした場合と等価である。
|
例1
event.OnBoot : $(entry "time."$(date %H) )
time.01 : 午前一時です\e
time.02 : 午前二時です\e
(中略)
time.23 : 午後十一時です\e
例2
event.OnFirstBoot : $(setstr 1stTime $(date %s) ; entry TalkFirstBoot)
sentence : (
\0\s[0]私が最初に起動したのは
$(date %y ${1stTime})年の
$(date %n ${1stTime})月
$(date %e ${1stTime})日で、\w8\w8
今日で$[ ($(date %s) - ${1stTime}) / (3600 * 24) ]日目です。\e
)
|
debugger
書式 |
$(debugger on)
$(debugger off)
|
戻り値 |
なし
|
機能 |
起動中のゴーストに、
幸水からの接続を許すかどうかを決める。
引数に「on」を指定すると、接続可能になる。
「off」を指定すると接続不可になる。
接続可能な場合、
System.Debuggerエントリに「on」という文が定義される。
|
例
=kis
# 幸水にてデバッグ中
debugger on;
=end
|
getenv
書式 |
$(getenv 環境変数名1)
|
戻り値 |
環境変数の内容
|
機能 |
OSの環境変数の内容を返す。
環境変数名1で指定した環境変数の内容を返す。
指定した環境変数がなかった場合、ヌル文字を返す。
|
例
$(getenv windir)
# 環境変数windirが存在する場合、その内容を返す
|
help
書式 |
$(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 >
|
logfile
書式 |
$(logfile ファイル名)
|
戻り値 |
なし
|
機能 |
ログを出力するファイルを設定する。
"-"を設定すると標準出力になる(幸水など)。
引数無しにすると、どこにも出力されない(デフォルト)。
|
例
=kis
# 日付付きログファイルを作成
logfile kawari-$(date %Y%m%d%H%M%S).log;
# ログ禁止
logfile;
=end
|
loglevel
書式 |
$(loglevel キーワードの列挙)
|
戻り値 |
なし
|
機能 |
ログに出力する内容を決める。
引数に列挙したキーワードに対応する内容が出力されるようになる。
キーワードには以下がある。
デフォルトではquietだが、
現在、一部のログが設定を無視して出力されてしまう既知のバグあり。
error | エラー |
warning | 警告 |
info | 動作情報 |
decl | 空エントリへの読み出しアクセス |
paranoia | 上記全て+非常に詳しい動作情報 |
baseevents | 基本イベント |
timeevents | 時刻(秒、分)イベント |
rscevents | リソース問い合わせイベント |
quiet | 明確にログを禁止する |
|
例
=kis
# 通常デバッグ時には、これで十分
loglevel error warning info baseevents;
# まぁ、一度ぐらいは試してみてもいいです
# 間違っても配布版でこれをやらないように
loglevel paranoia baseevents;
=end
|
logprint
書式 |
$(logprint 単語 [ 単語 ... ])
|
戻り値 |
なし
|
機能 |
ログに任意の文字列を出力する。
引数に指定された全ての単語をスペースを挟んで連結し、出力する。
|
例
=kis
# いわゆるprintfデバッグ
logprint ここまで動いた;
=end
|
mktime
書式 |
$(mktime 年 月 日 時 分 秒)
|
戻り値 |
1970/1/1 0:00:00(協定世界時)から指定時刻までに経過した秒数
|
機能 |
1970/1/1 0:00:00(協定世界時)から、引数で指定した時刻までに経過した秒数を返す。
主に戻り値を$(date %s)の第2引数に与える。
|
例
=kis
# 1970/1/1 0:00:00(UTC)から2005/4/1 0:30:25までに経過した秒数を返す
mktime 2005 4 1 0 30 25;
# 2001/1/25 1:00:00から1000日後の日付を求める
# 1000日分をmktimeで求めた時刻に足して、dateの第2引数に与えている
setstr @day $(mktime 2001 1 25 1 0 0);
date "%y/%m/%d %H:%M:%S" $[ ${@day} + 1000 * 24 * 60 * 60 ];
=end
|
rand
書式 |
$(rand 上限)
|
戻り値 |
整数の文字列
|
機能 |
0から上限の乱数を返す。戻り値は0を含み、上限を含まない。
上限は負の数でもよい。
|
例
=kis
rand 52;
# 0から51までの乱数を返す
rand -10;
# 0から-9までの乱数を返す
=end
|
rccharset
書式 |
$(rccharset 文字コード名)
|
戻り値 |
なし
|
機能 |
華和梨の出力するエラーメッセージの言語を、文字コードで指定する。
指定する文字列は大文字、小文字を同一視する(case insensitive)。
デフォルトは"ISO-8859-1"(いわゆる半角英文字、ほぼASCII)。
それ以外には、現在の所、"Shift_JIS"だけが使える。
対応していない文字コードを指定するとISO-8859-1になる。
|
例
=kis
# 日本人ならやっぱり?
rccharset Shift_JIS;
=end
|
securitylevel
書式 |
$(securitylevel レベル指定)
|
戻り値 |
なし
|
機能 |
セキュリティレベルを指定する。
以下の値を設定できる。
0 / low | 全てのイベントを許可する。 |
1 / middle | 外部からやってきたイベントを禁止。 |
2 / high | 当面は1(middle)と同じ。 |
3 / ultrahigh |
明確にローカルマシン発行と記されたイベントのみ許可。
|
なお、securitylevelコマンドは、ゴースト初期化中のみ、一回だけ実行可能である。
|
例
=kis
# 低レベルに設定
securitylevel low;
=end
|
srand
書式 |
$(srand シード)
|
戻り値 |
なし
|
機能 |
乱数の種を設定する。主にデバッグ目的で使用する。
|
例
=kis
srand 12345678;
# 乱数の種を「12345678」に設定する
=end
|
ver
書式 |
$(ver 情報名)
|
戻り値 |
バージョン情報
|
機能 |
"華和梨"の情報を返す。「情報名」で欲しい情報を選択できる。
情報名が「license」の場合、
"華和梨"のライセンス情報をログに出力する。
情報名が「author」の場合、
"華和梨"の開発者情報を返す。
情報名を省略した場合、"華和梨"のバージョン情報を返す。
バージョン情報のフォーマットは「基本名称[.補助名称[.補助名称]]/バージョン番号」。
|
例("幸水"での実行例)
echo-mode > $(ver)
KAWARI.kdt/8.2.0
|
Appendix
I. インラインスクリプトの追加方法
インラインスクリプトの関数コマンドは、簡単に追加できるよう、華和梨の他の部分と
別のフォルダにソースが収めてあります。srcフォルダ中のkisフォルダがそれです。
自分で"華和梨"を拡張する際、KISの追加だけで望む機能が得られるか、まず検討して
下さい。この場合、華和梨のほかの機能へ与える影響が少なく、無用のエンバグを
避けられます。また、他の人がソースコードを再利用しやすくなるはずです。
KISコマンド追加の基本手順は以下の通りです。
0) ソースを書き換える前に、オリジナルのソースがMakeできるか確認する
1) ソースコードのkis_echo.h/kis_echo.cppをよく読んで、参考にする
2) 拡張するKISコマンドのヘッダファイルを用意する
- config.hとkis_base.hをincludeする
- TKisFunction_baseクラスをpublicに継承し、コマンドのクラスを作る
- INLINE_SCRIPT_REGIST()マクロを使い、コマンドのクラスを登録
- メンバ関数Initに簡単な解説を書く
- メンバ関数string Function(vector<string>&)に処理を書く
3) ヘッダファイル名をkis_config.hに追加する
4) cppが増えた場合、必ずファイル名をfiles.makに追加しておく
5) Make
良いKISができたら、ぜひ教えてください。オリジナルの"華和梨"にも採用したいと思います。
II. 注釈
*1 構文コマンドと関数コマンド
構文と関数の、実用上最も重要な違いは、
- 構文の評価は引数評価以前に行われる
- 関数の評価は引数評価以後に行われる
という点です。引数評価以前は、
引数は「${npw}」や「$(echo Hello)」等の「書いたまま」の状態です。
一方、引数評価以後は、引数は展開されて、
「カルロス・ゴーン」や「Hello」等の「文字列だけ」の状態となります。
引数が通常の文字列だけである場合はさほど問題になりませんが、
引数にsetコマンド等の、
戻り値よりも機能が目的となるコマンドがあった場合、
この差が意味を持つことになります。
true : 真です。$(set tmp OK)
# 下記の二つは、表示上は恐らく同じ結果だが…
$(entry true ${cond}) # true文はcondが不成立でも実行されてしまう。
$(if ${cond} else ${true}) # true文はcondが不成立なら実行されない。
*2 インラインスクリプトに渡される引数の数
コマンドに引数を与える時、エントリ呼び出しで与える場合を考えます。
$(echo $(entry ${EntryName}) "Hello")
このケースで、EntryNameエントリに何もセットされていない場合を考えます。
この場合、echoコマンドの第1引数は""で、第2引数が「Hello」になります。
第1引数が「Hello」ということはありません。
インラインスクリプトに渡される引数の数と位置は、エントリ解釈の前に確定します。