# プログラマブル準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. コマンド一覧

構文コマンド
if | 条件判断
foreach | 指定エントリ中のすべての単語に対しコマンド実行
loop | 指定回数ループ
silent | ブロックの出力を抑制
until | 条件が成立するまでループ
while | 条件が成立している間ループ
break | ループからの脱出
continue | ループ先頭に戻る
NULL | 空文字列
? | ランダム選択
function | 関数定義
rmfunc | ユーザ定義関数の削除
return | 関数からの脱出

関数コマンド
辞書操作
共通事項 | 辞書操作コマンドに共通の特徴
set | エントリに単語をセット
setstr | エントリに文字列をセット
adddict | エントリに単語を追加
adddictstr | エントリに文字列を追加
push | エントリに単語を追加
pushstr | エントリに文字列を追加
unshift | エントリの先頭に単語を挿入
unshiftstr | エントリの先頭に文字列を挿入
insert | エントリ内の指定した位置に単語を挿入
insertstr | エントリ内の指定した位置に文字列を挿入
get | エントリ中の単語を得る
getcode | エントリを評価せずに参照
getrandom | エントリ中のいずれかの単語を得る
pop | エントリ最後尾の単語を返し、エントリから削除
popcode | エントリ最後尾の単語を評価せずに返し、エントリから削除
shift | エントリ先頭の単語を返し、エントリから削除
shiftcode | エントリ先頭の単語を評価せずに返し、エントリから削除
clear | エントリから単語を削除
cleartree | エントリツリーから単語を削除
size | エントリ中の単語数を数える
find | エントリ中の単語の最初の位置を得る
rfind | エントリ中の単語の最後の位置を得る
copy | エントリ内容のコピー
copytree | エントリ内容をエントリ構造ごとコピー
move | エントリ内容の移動
movetree | エントリ内容をエントリ構造ごと移動
listsub | サブエントリのリストを得る
listtree | エントリツリー全体のリストを得る
writeprotect | エントリを書き込み不可にする
ファイル操作
save | エントリをファイルに保存
savecrypt | エントリをファイルに暗号化して保存
load | 華和梨形式辞書ファイルを読み込む
textload | テキストファイルを読み込む
textappend | テキストファイルを追記
textsave | テキストファイルを保存
readdir | ディレクトリを読み込む
cncpath | パス名をシステムで使えるようにする
dirname | パス名からディレクトリ名部分を切り出す
filename | パス名からファイル名部分を切り出す
isexist | 指定ファイルが存在するか判定する
isdir | 指定ファイルがディレクトリか判定する
isfile | 指定ファイルが通常ファイルか判定する
カウンタ
dec | 指定エントリの単語を数字と見なし減算する
inc | 指定エントリの単語を数字と見なし加算する
文字列操作
length | 文字列の長さを得る
match | ある部分文字列が現れる最初の位置を得る
rmatch | ある部分文字列が現れる最後の位置を得る
match_at | ある部分文字列が指定位置に存在するか否か判定する
substr | 部分文字列を得る
char_at | 指定位置の文字を得る
sub | マッチする最初の文字列を置き換える
gsub | マッチする全ての文字列を置き換える
rsub | マッチする最後尾の文字列を置き換える
tr | 文字を置き換える
reverse | 文字列を逆順にする
tolower | アルファベットを小文字にする
toupper | アルファベットを大文字にする
chr | 指定した文字コードの一文字を返す
split | 文字列を区切り文字で分解
join | 区切り文字で文字列を結合
compare | 文字列を比較する
SAORI
saoriregist | SAORIを登録する
saorierase | SAORIの登録を解除する
saorilist | 登録中のSAORI一覧を返す
callsaori | 登録したSAORIを呼び出す
callsaorix | 登録したSAORIを呼び出す(高機能版)
コミュニケート機能
communicate | あるエントリの全ての単語を評価し、値から一つをランダムで選ぶ
matchall | 全てのキーワードに対してマッチング
出力
echo | 引数を空白文字で接続して返す
encode_entryname | エントリ名に使用できる名前に変換
escape | 引数内のさくらスクリプトをエスケープする
補助機能
entry | エントリを呼び出す
entrycount | エントリ総数を返す
eval | 単語を再評価
urllist | SHIORI/2.5形式のおすすめリストを出力する
wordcount | 単語総数を返す
xargs | 引数を展開して実行する
その他
rccharset | メッセージ文字セット設定
date | 日時を指定フォーマットで返す
mktime | 日時を通算経過秒数に変換する
getenv | 環境変数の内容を返す
help | KISコマンドオンラインヘルプ
logfile | ログファイルを指定する
loglevel | ログに取る種類を決める
logprint | ログに出力する
debugger | 幸水デバッガのON/OFF
rand | ランダムな整数を返す
srand | 乱数の種を設定する
securitylevel | セキュリティレベルの指定
ver | バージョン番号取得

### 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との違いは、指定文字列中に指定パターンが複数あった場合、 最後尾の１つだけ置換する点である。

    例
      =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との違いは、指定文字列中に指定パターンが複数あった場合、 先頭の１つだけ置換する点である。

    例
      =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」が返る
      =end

toupper
書式 | $(toupper 文字列1 ...)
戻り値 | 文字列中のアルファベット小文字を大文字に置換した結果
機能 | 文字列中のアルファベット小文字を大文字に置換する。 半角文字のみに作用する。

    例
      =kis
      toupper ABC def;
      # 「ABC DEF」が返る

      toupper ｘｙｚ xyz;
      # 「ｘｙｚ XYZ」が返る
      =end

tr
書式 | $(tr 文字列1 置換対象文字 変換文字)
戻り値 | 置換後の文字列
機能 | 指定文字列中に置換対象文字のいずれかがあった場合、 対応する変換文字に置き換える。 変換文字に対応する部分がない場合、""に置き換える。 perlのtr//dと同じ動作をする。

    例
      =kis
      tr AbＣｄあいう ABCDＡＢＣＤａｂｃｄ 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」ということはありません。 インラインスクリプトに渡される引数の数と位置は、エントリ解釈の前に確定します。