エントリの重複回避呼び出し¶
通常のエントリ呼び出し(${hoge})は、単語をランダムに選んで返します。しかし、同じ文章で同じエントリ呼び出しを複数使った場合、それぞれが異なることを保証しません。これが気になる場合、まず次のようなスクリプトを用意します。
# エントリからランダムに単語を重複せずに呼び出す
# 第1引数 : エントリ名
# 戻り値 : エントリ内の単語
# 備考 : 「エントリ名.buffer」というエントリを占有する
=kis
function GetWordRandom $(
if $[ $(size @arg) != 2] $(return);
if $[ $(size $@arg[1].buffer) == 0 ] $(copy $@arg[1] $@arg[1].buffer);
setstr @pos $(rand $(size $@arg[1].buffer));
get $@arg[1].buffer[${@pos}];
clear $@arg[1].buffer[${@pos}];
);
=end
# 指定エントリを単語重複せず呼び出すエントリ化する
# 第1引数 : エントリ名
# 戻り値 : なし
# 備考 : 「エントリ名.backup」、「エントリ名.backup.buffer」という
# エントリを占有する
=kis
function Nonoverlap $(
if $[ $(size $@arg[1].backup) == 0 ] $(copy $@arg[1] $@arg[1].backup);
set $@arg[1] "$(GetWordRandom "$@arg[1]".backup)";
writeprotect $@arg[1];
writeprotect $@arg[1].backup;
);
=end
そして、次のように書きます。
# 「人名」エントリを重複回避して呼ぶよう指定する
=kis
Nonoverlap 人名;
=end
すると、単に${人名}と呼ぶだけで、エントリ内の単語をすべて使うまで、同じ単語を呼ばなくなります。単語を呼ぶ順序は、通常通りランダムです。
この記述をすると、指定したエントリに単語の追加が出来なくなります。指定する際は、辞書の読み込みがすべて完了した時点で、Nonoverlapを実行すると良いでしょう。