# プログラマブル準AIモジュール "華和梨" 重要な変更点と移行ガイド

2004/02/01
Phase 8.2.0

華和梨開発チーム :
NAKAUE.T (Meister), 偽Meister (夢乃), さとー, 酔狂, さくらのにえ

華和梨Phase 8では、かつてないほど大規模な変更が行われているため、 移行には、実質的に新しい栞に乗り換えるのと同等のコストがかかると見込まれます。 その負担を少しでも減らすために、 過去互換性を持たない重要変更点と、移行のヒントを挙げます。 新しい仕様の詳細はユーザーズマニュアルを参照してください。

## Index

← back

> 1. kawari.ini消滅
> 2. システムエントリ整理/イベントエントリ統合
> 3. マッチエントリ消滅
> 4. 内臓piro消滅
> 5. 履歴参照ルールが小変更
> 6. expr, test消滅
> 7. if文の文法変更
> 8. enumerate消滅
> 9. get/setの動作変更
> 10. その他のKISコマンドの変更
> 11. 複数行対応

## 1. kawari.ini消滅

kawari.iniは使えなくなりました。 華和梨が読み込む全てのファイルは、単一の「華和梨辞書形式」になります。 華和梨辞書形式では、「ゾーン切り替え」によって、辞書が読み込まれた瞬間にその場で直接実行されるKIS文を書けるようになっています。 つまり、以前kawari.iniでしかできなかったことが、全ての辞書ファイルで可能になりました。

華和梨Phase8が最初に読むファイルは「kawarirc.kis」になりました。 当然、これも普通の辞書ファイルです。

直接KISを書くゾーンに切り替えるには、 そのゾーンを「=kis」のみの行と 「=end」のみの行で囲います。

=kis
=end

従来の書式をPhase 8の書式で書き直すと以下のようになります。

# 従来
dict : dict-dms.txt
include : keeps.ini
adddict : author 偽Meister
set : myname 二葉亭四迷
text : spell necronomicon.txt
debug : log
randomseed : 100
security : 0
# Phase 8バージョン。
# KIS文を区切るためのセミコロンが必要なことに注意
# =kis 〜 =endは、文法的には$( 〜 )と全く完全に同じです。
=kis
# 辞書のロード
load dict-dms.txt;
# 全て辞書ファイルなので、loadコマンドのみです。
load keeps.ini;
# 文の追加
adddict author 偽Meister;
# 文のセット
set myname 二葉亭四迷;
# テキストファイルの読み込み(従来のtextloadと引数の順序が逆になっています!)
textload spell necronomicon.txt;
# ログをファイルに書き出します
logfile kawari.log;
## 以下のようにすると、起動時日付つきのファイルに書き出します
# logfile kawari-$(date %Y%m%d%H%M%S).log;
# ログに取るべきイベントや情報の種類を指定します
loglevel error warning info baseevents;
# 乱数の種の指定
srand 100;
# セキュリティレベルの指定(通常は必要ありません)
securitylevel low;
=end

## 2. システムエントリ整理/イベントエントリ統合

システムエントリの構成が大幅に変更されました。 event.イベント名や、 system.OnXXXXX形式のエントリは自動的には呼ばれません。 イベント処理ルーチンを自力で開発していた方は注意してください。

従来華和梨が行っていた作業についても、KISで書くようになっています。 逆に言えば、変更するには華和梨のバイナリを書き換える以外なかった部分まで、 KISで修正が可能です。

詳細はユーザーズマニュアルを参照してください。

## 3. マッチエントリ消滅

マッチエントリ(コミュニケートに用いました)機能が削除されました。 従来のマッチエントリには、ゴースト名やシチュエーションに依存して処理を切り分けることができないという欠点がありました。

Phase 8では、いわゆるコミュニケートイベントは、ほとんどSHIORI仕様に直結した形になっており、華和梨システムが大きなサポートをすることはありません。 その代わり、コミュニケート支援のためのKISコマンドが幾つか追加され、 コミュニケート機能を助けるKISパッケージを作成できるようになっています。 そうしたパッケージを探して利用するのが良いでしょう。

## 4. 内蔵piro消滅

削除しました。 華和梨辞書形式で書いてください。

## 5. 履歴参照ルールが小変更

従来は「履歴参照による置換は履歴参照に追加されない」 「エントリ呼び出し以外は履歴参照に追加されない」でしたが、 Phase 8では、 「$で始まるものは全て履歴参照に入る」 に変更されました。

## 6. expr, test消滅

exprコマンド、testコマンドは削除され、 新たに「演算式」が書けるようになりました。 演算式は$[ 〜 ]という書式になります。 基本的にはexprの機能を引き継いだものです。

幸水の表記で演算式をいくつか示します：

echo-mode > $[4*(10+2)]
48
echo-mode > $[${npw.special}||${npw}]
龍太郎
echo-mode > $["伺か"=~"何か"]
false

演算式中では、以前のexprやtestが持っていた全ての演算記号に限らず、 常識的な演算記号は全て使えます。 testの持っていた、-gtや-ltと言った演算子はなくなり、 exprのように文字列と数値は自動判別されるようになりました。

# 従来
event.OnMusicPlay: $(if $([ ${freeze} -eq 0 ]) ${OnMusicPlay1})
# Phase 8
event.OnMusicPlay: $(if $[${freeze}==0] ${OnMusicPlay1})
# こう書くこともできます
event.OnMusicPlay: $(if $[!${freeze}] ${OnMusicPlay1})

$[ 〜 ]の中では自由に空白・改行を入れられます。 空白が全く無くてもかまいません。

( 〜 )によるグルーピングができます。 exprでは、閉じかっこのみクォートが必須という仕様でしたが、 演算式では普通に式が書けます。

ただし、exprの'|'、'&'は、それぞれ、 '||'、'&&'になりました。 比較などに 文字列を使う場合は、必ずクォートしなければならなくなりました。 exprの持っていたsubstr, lengthなどの演算機能(サブコマンド)は、 独立したKISコマンドとして再定義されました。

数値についてはexpr, testと同様、整数しか使えません。 また、数値と見なせるものは強制的に数値扱いになります。 どうしても文字列として比較を行いたい場合は、 KISのcompareコマンドを使ってください。

# 従来
OnMusicPlay1: $(if $([ $(expr substr ${system.Reference0} 2 6) != "Buffer" ]) ${OnMusicPlay2})
# Phase 8
OnMusicPlay1: $(if $[$(substr ${system.Reference0} 2 6)!="Buffer"] ${OnMusicPlay2})

## 7. if文の文法変更

以下のようになりました。

# 従来
if <条件> <条件が正しいときの単語>;
if <条件> <条件が正しいときの単語> <条件が正しくないときの単語>;
# Phase 8
if <条件> <条件が正しいときの単語>;
if <条件> <条件が正しいときの単語> else <条件が正しくないときの単語>;
if <条件> <条件が正しいときの単語> else if <条件その2> <条件その2が正しいときの単語>;
if <条件> <条件が正しいときの単語> else if <条件その2> <条件その2が正しいときの単語> else <条件が全て正しくないときの単語>;

else や if と、その直前直後の単語との間、また、条件と実行単語の間には、 必ず空白か改行が必要です。 連続して書いてはいけません。

× if $[${入力}=~"偽春菜"] $(echo その名で呼ぶな！)else$(echo 何ですか);
○ if $[${入力}=~"偽春菜"] $(echo その名で呼ぶな！) else $(echo 何ですか);
# 上のif文の場合は、下のように書くのが普通
○ if $[${入力}=~"偽春菜"] その名で呼ぶな！ else 何ですか;

条件はいくらでも並べることができます。 KISが書ける場所は必ず複数行に分けて書けるため、 以下のように見やすく並べることができます。

if $[${date}<7] 最初の一週間
else if $[${date}<14] 次の一週間
else if $[${date}<21] 三週目
else if $[${date}<28] 四週目
else 最後の週 ;

複数行対応の副作用として、 $( 〜 )の最後以外では、 構文コマンドにおいても、末尾にセミコロン(';')が必要 という点が見過ごされやすくなってしまいました。 気を付けてください。 基本的にセミコロンを付ける習慣にすると良いでしょう。 if文は、elseやelse if節の全てを含めて一つのインラインスクリプト文になるため、 全体の最後にのみセミコロンが必要であり、それは必須です。

## 8. enumerate消滅

極めて例外的な動作を行っていたenumerateコマンドは削除されました。 getcodeやloopコマンドを使ってください。

## 9. get/setの動作変更

辞書アクセスコマンドは完全に刷新されました。

従来はエントリ中の単語の順序は非保証(順序が保たれるとは限らない)でしたが、 Phase 8ではエントリ中の単語の順序が保証されるようになったため、 「あるエントリのx番目の単語を取り出す」 という処理が正式にできるようになりました。

それに従い、get/set系コマンドについては、 get リストエントリ[2] のように、 エントリ名に添えられた[ ]によって、 エントリの何番目かを指定できるようになりました。 この書き方はget/setシリーズ、およびinsert/clearコマンドにおいて有効です。

また、 getコマンドを従来どおりに get エントリ名 と呼ぶと、エントリに存在する全ての単語を実行する ようになりました。注意してください。 get エントリ名[0]とするか、 getrandom エントリ名、もしくは entry エントリ名 とすると良いでしょう。

setstr/pushstr/adddictstrコマンドが追加されました。 引数を「必ず文字列として扱うように」追加するコマンドです。 通常の使用では、ほぼxxxstr系を使う形が最適のはずですので、 できるだけこれらを利用するようにしてください。

## 10. その他のKISコマンドの変更

textload/readdirの引数順が、共に

コマンド名 対象 格納エントリ名

だったものが、

コマンド名 格納エントリ名 対象

に変更されました。

textload/splitは、出力が「エントリ名.1」「エントリ名.2」... という風に別エントリに格納されていたものが、 単純に、一つのエントリの0番目の文、1番目の文、... という風に一つのエントリの別の文として格納されるようになりました。

## 11. 複数行対応

辞書中の幾つかの場所を、複数行に展開して書けるようになりました。 これらは、 従来一行に書かなければならなかったものを、途中で改行できるようにした ものなので、従来通り一行に書いても問題ありません。