プログラマブル準AIモジュール

「"華和梨" for あれ以外の何か以外の何か」
華和梨インラインスクリプト リファレンスマニュアル

2002/01/08
Phase 7.3.1

華和梨開発チーム

NAKAUE.T (Meister)
夢乃 (偽Meister)
酔狂
さとー

Index

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. コマンド-出力
  4.2.7. コマンド-補助機能
  4.2.8. コマンド-その他
Appendix
 I. インラインスクリプトの追加方法
 II. 注釈

1. 概要

華和梨インラインスクリプト(KIS : Kawari Inline Script)は、 華和梨の辞書ファイル中で使用できる簡易言語です。 インラインスクリプトを使用することにより、 華和梨実行中に辞書へ単語を追加したり、 本体から通知されるイベントに応じた処理を行ったりすることができます。

2. 書式

インラインスクリプトは、単語中に「$(〜)」 で囲んで記述します。一つの「$(〜)」で囲まれた塊を、「ブロック」と呼びます。 一つのブロックの中には、複数の文を記述できます。 文と文の間は「;」(セミコロン)で区切ります。 一つの文は、一つのコマンドと零個以上の引数から構成されます。 コマンド、セミコロン、各引数の間は、それぞれ一つ以上の空白で区切ります。

  インラインスクリプト:
    ブロック

  ブロック:
    $(文)
    $(文 ; 文 ; …)

  文:
    コマンド名 引数1 引数2 …

3. 評価、戻り値、真偽の判定

ブロックがイベント呼び出し、発話要求等を通じて華和梨に解釈されることを、 「評価」と呼びます。ブロックは評価されると、「戻り値」を返します。 戻り値は一つの文字列で、どのような戻り値を返すかはコマンドによって異なります。 コマンドによっては、つねに「""」(空文字列)を返すこともあります。

ブロックが複数の文から成る場合、ブロックの戻り値は、 ブロック中の全ての文の戻り値を順に繋げたものです。 なお、ブロックから戻り値を返したくない場合、 silentコマンドを使用すれば抑制できます。

華和梨が戻り値を評価し、ブール代数における「真」か「偽」かを判定する際、 次のような基準で判定します。

この真偽の判定は、後述する構文コマンド、関数コマンド問わず共通です。 コマンドを独自に追加する場合、真偽の判定はこの基準に合わせて下さい。

4. コマンド

コマンドは大きく分けて、ifコマンドや whileコマンドのような「構文コマンド」と、 adddictコマンドやdateコマンドの ような「関数コマンド」の二つに分類できます。 構文コマンドは与えられた条件の真偽に従い、処理の流れを制御します。一方、 関数コマンドは与えられた引数に従い、実際の処理を行います。 *1 *2

混同する恐れの無い場合、構文コマンドは「構文」、関数コマンドは単に 「コマンド」と呼ぶことがあります。

4.1. コマンド一覧

構文コマンド
if条件判断
foreach指定エントリ中のすべての単語に対しコマンド実行
loop指定回数ループ
silentブロックの出力を抑制
until条件が成立するまでループ
while条件が成立している間ループ
NULL空文字列
?ランダム選択

関数コマンド
辞書操作
adddictエントリに単語を追加
arrayエントリを配列的に参照
clearエントリを消去
enumerateエントリの全単語を列挙
getエントリを評価せずに参照
setエントリに単語をセット
sizeエントリ中の単語数を数える
ファイル操作
load華和梨形式辞書ファイルを読み込む
readdirディレクトリを読み込む
saveエントリをファイルに保存
savecryptエントリをファイルに暗号化して保存
textloadテキストファイルを読み込む
カウンタ
dec指定エントリの単語を数字と見なし減算する
inc指定エントリの単語を数字と見なし加算する
評価・比較
expr式を評価する
test値を比較する
出力
echo引数を空白文字で接続して返す
escape引数内のさくらスクリプトをエスケープする
補助機能
chr指定した文字コードの一文字を返す
entryエントリを呼び出す
eval単語を再評価
pirocall内蔵piroを呼び出す
split文字列を区切り文字で分解
urllistSHIORI/2.5形式のおすすめリストを出力する
その他
date日時を指定フォーマットで返す
helpKISコマンドオンラインヘルプ
randランダムな整数を返す
tolowerアルファベットを小文字にする
toupperアルファベットを大文字にする
verバージョン番号取得

4.2. コマンドリファレンス

4.2.1. 構文

if
書式 $(if 条件文 真の場合の文 偽の場合の文)
$(if 条件文 真の場合の文)
戻り値 真の場合の文、または偽の場合の文の戻り値
機能 条件文の真偽に応じ、真の場合の文、または偽の場合の文を 実行する。 条件文にインラインスクリプトを用いる場合には、$()で囲む。 真の場合の文、偽の場合の文も同様。
例1
  $(if $([ ${mode} == "Y" ]) "\h\はい\e" "\hいいえ\e")
    # modeエントリの内容で検索したものが"Y"の場合、「はい」と表示
    # それ以外の場合は「いいえ」と表示

例2
  $(if "true" $(set a "1" ; set b "2") )
    # aエントリの内容は1、bエントリの内容は2になる
    # マルチステートメント(複文)を使っている

例3
  a : 1
  b : 2
  $(if $([ ${a} == "1" ]) $(if $([ ${b} == "2"]) "あたり" "はずれ") "はずれ")
    # 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回表示される
silent
書式 $(silent)
戻り値 なし
機能 マルチステートメント中、silentが登場するまでの戻り値を破棄。
例
  $(echo 1 ; echo 2 ; silent ; echo 3) #「3」がブロックの戻り値になる
参考
  $(echo 1 ; echo 2 ; echo 3)          #「123」がブロックの戻り値になる
until
書式 $(until 条件文 文1)
戻り値 文1の戻り値
機能 条件文が偽の間、文1を繰り返し評価する。 条件文、文1にインラインスクリプトを用いる場合には、$()で囲む。
例
  $(set A ${npw} ; set B ${npw} ; until $([ ${A} != ${B} ]) $(set B ${npw}))
  # AエントリとBエントリが必ず異なるようにする
while
書式 $(while 条件文 文1)
戻り値 文1の戻り値
機能 条件文が真の間、文1を繰り返し評価する。 条件文、文1にインラインスクリプトを用いる場合には、$()で囲む。
例
  $(set A ${npw} ; set B ${npw} ; while $([ ${A} == ${B} ]) $(set B ${npw}))
  # AエントリとBエントリが必ず異なるようにする
NULL
書式 $(NULL)
戻り値 なし(空文字列)
機能 空文字列を返す。
例
  $(if $([ ${test1} == $(NULL) ]) $(echo "test1はカラ") )
  # test1エントリに何も入っていないか、空白を返されたときにメッセージを表示
?
書式 $(? 文1 文2 ... 文n)
戻り値 文1から文nまでの内どれか一つの戻り値
機能 引数として与えられた文から、どれか一つをランダムに選んで評価する。 拡張makotoの代用。
例
  $(? "右" "左")"に行く"
  # 「右に行く」または「左に行く」と表示される

4.2.2. コマンド-辞書操作

adddict
書式 $(adddict エントリ1 単語1)
戻り値 なし
機能 エントリ1に単語1を追加する。
例
  $(adddict npw 田中真紀子)   # npwエントリに「田中真紀子」を追加
  $(adddict name ${npw})      # nameエントリにnpwエントリ中の単語を追加
  $(adddict Act "${normal}")  # Actエントリに「${normal}」を追加
array
書式 $(array エントリ1 インデックス)
戻り値 エントリ1の(インデックス+1)番目の単語の文字列
機能 エントリ1の(インデックス+1)番目の単語を返す。
テスト中の機能であり、仕様変更の可能性が高い。
例
  $(set i 0 ; loop $(size npw) $(array npw ${i} ; echo "\n" ; inc i))
  # $(foreach i npw $(echo ${i}"\n"))と等価
  
  Check : $(if $([ $(array npw ${i}) == "END" ]) $(set i $(size npw)) $(inc i))
  $(set i 0 ; while $([ ${i} -lt $(size npw) ]) ${Check})
  # npwエントリの全単語を順に参照し、「END」という内容があったらループ終了
clear
書式 $(clear エントリ1)
戻り値 なし
機能 エントリ1から内容をすべて削除する。
例
  test1 : word1, word2, word3
  $(clear test1)              # test1エントリの内容を全て消去
enumerate
書式 $(enumerate エントリ1)
戻り値 検索結果
機能 エントリ1に含まれる全ての単語を、空白文字で接続して返す。
例
  season : 春 , 夏 , 秋 , 冬
  $(enumerate season) # 「春 夏 秋 冬」を返す
get
書式 $(get エントリ1 インデックス)
戻り値 エントリ1の(インデックス+1)番目の単語の文字列
機能 エントリ1の(インデックス+1)番目の単語を、単語内のエントリ 呼び出し、インラインスクリプトを評価せずに文字列として返す。
テスト中の機能であり、仕様変更の可能性が高い。
例
  shiori : 偽栞$(set AI 偽栞), 華和梨$(set AI 華和梨), 翡翠$(set AI 翡翠)
  $(get shiori 1)  # 「"華和梨"$("set" "AI" "華和梨" )」が返る
                   # AIエントリには何もセットされない

参考
  ${shiori}        # 偽栞、華和梨、翡翠のどれかが返り、戻り値と同じ内容が
                   # AIエントリにセットされる
set
書式 $(set エントリ1 単語1)
戻り値 なし
機能 エントリ1から一度内容をすべて削除してから、単語1を登録する。
例
  dummy : 1
  $(set mode 1)               # modeエントリの内容は「1」だけになる
  $(set mody ${dummy})        # modeエントリの内容は${dummy}=「1」になる
  $(set emotion "${angry}")   # emotionエントリの内容は「${angry}」になる
size
書式 $(size エントリ1)
戻り値 単語数
機能 エントリ1中の単語数を返す。
例
  理夢 : 理夢
  ninni.angels,famous.ghosts : 奈留, せりこ, まゆら, ${理夢}
  dark.sisters,famous.ghosts : 毒子, 花ちゃん, サンバーレイン, ${理夢}
  $(size dark.sisters)               # 4が返る
  $(size famous.ghosts)              # 8が返る

4.2.3. コマンド-ファイル操作

load
書式 $(load ファイル名)
戻り値 なし
機能 華和梨辞書形式ファイルを読み込む。暗号化辞書も可。 ファイル名の先頭が「/」「\」またはドライブ名から始まる場合には 絶対パスとみなし、それ以外の場合にはゴーストのディレクトリからの 相対パスとみなす。 kawari.iniに「dict : ファイル名」と書いた場合と同じ動作をする。
例
  $(load dict-flag.txt) # dict-flag.txtを読み込む
readdir
書式 $(readdir ディレクトリ エントリ1)
戻り値 なし
機能 指定ディレクトリに含まれるファイル・ディレクトリ名を エントリ1に保存する。エントリ1の以前の内容は消去される。
ディレクトリ名は相対パスも可。
例
  $(readdir "..\..\shell" shell) # 自ゴーストで使用できるシェル一覧をshellに保存
save
書式 $(save ファイル名 エントリ名1 ... )
戻り値 なし
機能 ファイルにエントリ内容を華和梨辞書形式でセーブする。 saveが実行されると指定ファイルの内容は一旦クリアされ、 指定エントリ群の内容が新たに書きこまれる。
例
  $(save dict-flag.txt flag1 flag2 flag3)
  # flag1、flag2、flag3エントリをdict-flag.txtに保存
savecrypt
書式 $(savecrypt ファイル名 エントリ名1 ... )
戻り値 なし
機能 ファイルにエントリ内容を暗号化華和梨辞書形式でセーブする。 savecryptが実行されると指定ファイルの内容は一旦クリアされ、 指定エントリ群の内容が新たに書きこまれる。
例
  $(savecrypt dict-flag.txt flag1 flag2 flag3)
  # flag1、flag2、flag3エントリをdict-flag.txtに暗号化して保存
textload
書式 $(textload ファイル名 エントリ1)
戻り値 なし
機能 テキストファイルを読み込む。
ファイルの1行目は「エントリ1.1」、2行目は「エントリ1.2」、 ファイルのn行目は「エントリ1.n」というエントリにそれぞれ書き込む。
ファイルの行数は「エントリ1.size」に書き込む。
例
  $(textload mypoem.txt poem)
  \0$(set i 1 ; loop ${poem.size} $(entry poem.${i} ; inc i))\e
  # ファイルmypoem.txtの内容を読み込み、さくら側バルーンで内容を表示する

4.2.4. コマンド-カウンタ

dec
書式 $(dec エントリ1 減分 下限)
戻り値 なし
機能 エントリ1を減分だけ減算する。減分と下限は省略可能。 減分を省略した場合、1と見なす。 減算した結果が下限より小さくなった場合、エントリ1の内容は下限となる。 下限を省略するといつまでも減算できる。
例
  $(dec N)        # Nを1だけ減らす
  $(dec N 5)      # Nを5だけ減らす
  $(dec N 10 0)   # Nを10だけ減らし、結果が0より小さければNは0とする
inc
書式 $(inc エントリ1 増分 上限)
戻り値 なし
機能 エントリ1を増分だけ加算する。増分と上限は省略可能。 増分を省略した場合、1と見なす。 加算した結果が上限より大きくなった場合、エントリ1の内容は上限となる。 上限を省略するといつまでも加算できる。
例
  $(inc N)        # Nを1だけ増やす
  $(inc N 5)      # Nを5だけ増やす
  $(inc N 10 100) # Nを10だけ増やし、結果が100より大きければNは100とする

4.2.5. コマンド-評価・比較

expr
書式 $(expr EXPRESSION)
戻り値 EXPRESSIONの値。真偽値は"1"(真)か""(偽)で返る。
機能 EXPRESSIONで与えられた式を評価し、その値を返す。 GNU exprを規範とした機能、構文を持つ。 以下に留意のこと。
  • 一つ一つの記号は空白で区切る。
  • exprは数値と文字列の双方を扱う。ただし、 数値として認識されるのはいわゆる「半角」の10進整数のみ。
EXPRESSIONの種類は以下の通り。
ARG1 | ARG2
ARG1。ただし、ARG1が偽ならARG2。
ARG1 & ARG2
ARG1。ただし、ARG1とARG2どちらかが真でないなら、""。
ARG1 < ARG2
ARG1がARG2より小さければ真("1")。そうでないなら偽("")。 以下、比較演算は全て文字列にも適用可。
ARG1 <= ARG2
ARG1がARG2と等しいか、より小さければ真。そうでなければ偽。
ARG1 = ARG2
ARG1とARG2が等しければ真。"=="にも対応。
ARG1 != ARG2
ARG1とARG2が等しくなければ真。
ARG1 >= ARG2
ARG1がARG2と等しいか、より大きければ真。そうでなければ偽。
ARG1 > ARG2
ARG1がARG2より大きければ真。そうでなければ偽。
ARG1 + ARG2
加算。どちらかあるいは両方が数値でなければ""。
ARG1 - ARG2
減算。どちらかあるいは両方が数値でなければ""。
ARG1 * ARG2
乗算。どちらかあるいは両方が数値でなければ""。
ARG1 / ARG2
除算。どちらかあるいは両方が数値でなければ""。
ARG1 % ARG2
剰余。ARG1をARG2で割った余り。 どちらかあるいは両方が数値でなければ""。
substr STRING POS LENGTH
部分文字列を得る。 STRING中のPOS番目の文字からLENGTH長だけ切り出す。 POSは1から数えるので注意。いわゆる「全角文字」も1文字ずつ数える。
index STRING CHARS
STRING中でCHARSに含まれるどれかの文字が最初に現れる場所を返す。 位置は1から数える。
length STRING
STRINGの長さ。
quote TOKEN
TOKENを一まとまりの文字列とみなす。 TOKENが"index"や"length"であってもそれをキーワードとしないようにする。
( EXPRESSION )
EXPRESSIONの評価結果。これを使って入れ子の表現が可能になる。 $(〜) のインラインスクリプトそのものを入れ子にするわけではないことに注意。 $(expr 遅いねぇ & ( ( date %H ")" > 22 ")") などということは不可能。 ただし、$(expr 遅いねぇ & ( $(date %H) > 22 ")") は可能。 また、) をクォートしないと$( の対応カッコだと思われるので注意。
find STRING SUBSTRING
STRING中にSUBSTRINGがあればSUBSTRINGを返す。無ければ""。 本来のexprには存在しないが、matchが無いので代替品として導入した。
findpos STRING SUBSTRING
STRING中にSUBSTRINGがあれば、その先頭の位置を返す。なければ""。 同じく本来のexprには存在しないが、頻繁に使うので導入した。
STRING : REGEXP
match STRING REGEXP
未実装。
例:
$(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
test
書式 $(test 条件式)
$([ 条件式 ])
戻り値 条件式が真なら"true"、偽なら"false"
機能 条件式の真偽を返す。比較演算子は以下が使える。
    A : Aが真ならば真
    !A : Aが偽ならば真
    A==B : AとBが同じ文字列ならば真
    A=B : AとBが同じ文字列ならば真
    A!=B : AとBが同じ文字列でなければ真
    A<B : AがBより辞書順で前にあれば真
    A>B : AがBより辞書順で後にあれば真
    A<=B : AがBより辞書順で後でなければ真
    A>=B : AがBより辞書順で前になければ真
    A-eqB : AがBと等しければ真
    A-neB : AがBと等しくなければ真
    A-ltB : AがBより小さければ真
    A-gtB : AがBより大きければ真
    A-leB : AがB以下ならば真
    A-geB : AがB以上ならば真
    A&&B : AとBが共に真ならば真
    A||B : AもしくはBが真ならば真
例
  XBOX : toy
  PS2 : computer
  Workstation : computer
  ZAURUS : 40000
  visor : 25000
  $(test ${XBOX} == "toy")       # 「true」が返る
  $(test ${PS2} != "computer")   # 「false」が返る
  $(test ${ZAURUS} -lt ${visor}) # 「false」が返る
  $(if $([ ${PS2} == ${Workstation} ]) "\hPS2欲しい!\e" "\hPS2いらない。\e")
  # 「PS2欲しい!」と表示する

4.2.6. コマンド-出力

echo
書式 $(echo 単語1 ...)
戻り値 全引数を空白文字で接続したもの
機能 与えられた全引数を、空白文字で区切って返す。
例
  $(echo 1 2 3 4 5)                     # 「1 2 3 4 5」が返る
  $(set test1 "TEST" ; echo ${test1})   # 「TEST」が返る
escape
書式 $(escape 単語1 ...)
戻り値 全引数を空白文字で接続し、「\」を「\\」に、「%」を「\%」に置換したもの
機能 与えられた全引数のさくらスクリプトをエスケープする。
例
  event.OnFileDropped : $(escape ${system.Reference0})がドロップされました。
  # ドラッグ&ドロップされたファイル名を表示する

4.2.7. コマンド-補助機能

chr
書式 $(chr 文字コード)
戻り値 指定した文字コードの一文字
機能 指定した文字コードの一文字を返す。
例
  $(chr 1)    # いわゆる「バイト値1」が返る
  $(chr 2)    # いわゆる「バイト値2」が返る
entry
書式 $(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
書式 $(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
書式 $(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
書式 $(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
書式 $(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を与える必要がある

4.2.8. コマンド-その他

date
書式 $(date 書式文字列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)
    %w: 曜日(0..6,日曜日が0)
    %y: 年(4桁,2000...)
    %Y: 年(4桁,2000...)
例
  event.OnBoot : $(entry "time."$(date %H) )
  time.01 : 午前一時です\e
  time.02 : 午前二時です\e
  (中略)
  time.23 : 午後十一時です\e
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 >
rand
書式 $(rand 上限)
戻り値 整数の文字列
機能 0から上限の乱数を返す。戻り値は0を含み、上限を含まない。 上限は負の数でもよい。
例
  $(rand 52)    # 0から51までの乱数を返す
  $(rand -10)   # 0から-9までの乱数を返す
tolower
書式 $(tolower 文字列1 ...)
戻り値 文字列中のアルファベット大文字を小文字に置換した結果
機能 文字列中のアルファベット大文字を小文字に置換する。 半角文字のみに作用する。
例
  $(tolower ABC def)    # 「abc def」が返る
  $(tolower XYZ XYZ) # 「XYZ xyz」が返る
toupper
書式 $(toupper 文字列1 ...)
戻り値 文字列中のアルファベット小文字を大文字に置換した結果
機能 文字列中のアルファベット小文字を大文字に置換する。 半角文字のみに作用する。
例
  $(toupper ABC def)    # 「ABC DEF」が返る
  $(toupper xyz xyz) # 「xyz XYZ」が返る
ver
書式 $(ver)
戻り値 バージョン情報
機能 "華和梨"のバージョン情報を返す。
バージョン情報のフォーマットは「基本名称[.補助名称[.補助名称]]/バージョン番号」。
例("幸水"での実行例)
  echo-mode > $(ver)
  KAWARI/6.2.0

Appendix

I. インラインスクリプトの追加方法

インラインスクリプトの関数コマンドは、簡単に追加できるよう、華和梨の他の部分と 別のフォルダにソースが収めてあります。srcフォルダ中のkisフォルダがそれです。 自分で"華和梨"を拡張する際、KISの追加だけで望む機能が得られるか、まず検討して 下さい。この場合、華和梨のほかの機能へ与える影響が少なく、無用のエンバグを 避けられます。また、他の人がソースコードを再利用しやすくなるはずです。

KISコマンド追加の基本手順は以下の通りです。

0) ソースを書き換える前に、オリジナルのソースがMakeできるか確認する
1) ソースコードのkis_echo.h/kis_echo.cppをよく読んで、参考にする
2) 拡張するKISコマンドのヘッダファイルを用意する
3) ヘッダファイル名をkis_config.hに追加する
4) cppが増えた場合、必ずファイル名をfiles.makに追加しておく
5) Make

良いKISができたら、ぜひ教えてください。オリジナルの"華和梨"にも採用したいと思います。

II. 注釈

*1 構文コマンドと関数コマンド

構文と関数の、実用上最も重要な違いは、

という点です。引数評価以前は、 引数は「${npw}」や「$(echo Hello)」等の「書いたまま」の状態です。 一方、引数評価以後は、引数は展開されて、 「カルロス・ゴーン」や「Hello」等の「文字列だけ」の状態となります。 引数が通常の文字列だけである場合はさほど問題になりませんが、 引数にsetコマンド等の、 戻り値よりも機能が目的となるコマンドがあった場合、 この差が意味を持つことになります。

  true : 真です。$(set tmp OK)
  # 下記の二つは、表示上は恐らく同じ結果だが…
  $(expr ${true} & ${cond})   # true文はcondが不成立でも実行されてしまう。
  $(if ${cond} ${true})       # true文はcondが不成立なら実行されない。

*2 インラインスクリプトに渡される引数の数

コマンドに引数を与える時、エントリ呼び出しで与える場合を考えます。

  $(expr $(entry ${EntryName}) | "Hello")

このケースで、EntryNameエントリに何もセットされていない場合を考えます。 この場合、exprコマンドの第1引数は空文字で、第2引数が「|」、第3引数が 「Hello」になります。 第1引数が「|」で、第2引数が「Hello」ということはありません。 インラインスクリプトに渡される引数の数と位置は、エントリ解釈の前に確定します。