makoto.dll (download) version 1.02 (ソースコード)

これは?

makoto.dll とは 某「あれ以外の何か with 任意」システムにおいて トランスレータ と位置付けられているDLLです。
この「任意」システムは何かと名前が頻繁に変わるので、あなたがここを見るときには別の名前かもしれませんが、まあ何のことかはわかってもらえると思います。
簡単に言うと、さくらスクリプトの表現力を豊かにするDLLです。

効用

例えば、「明日の天気は晴れです。」という文章があったとします。
日本語の口語の特徴として、「語尾や途中が微妙に変化する」 というものがあると思います。つまり、

「明日の天気は晴れなんだって。」
「明日の天気は晴れっぽいよ。」
「明日の天気は晴れっぽいよぉ。」
「明日って晴れるみたい。」

という感じです。このトランスレータを使うと、こういう文章が比較的簡単に記述できます。
また、応用?として
● 文中の名詞を選択させる。(組合せ: ex.1)
● うにゅうのつっこみを入れたり入れなかったりする。(組合せ: ex.2)
などということができます。

具体的にどういうトランスレータなのか

これは本家が配布している makoto basic と同じような(注1)機能を提供しつつ、正規表現の逆のような(注2)処理を行います。
具体的には、以下のような機能を持ちます。

基本1: 選択

(A|B|C|...|Z)

ならば A,B,C,...,Zのいずれか一つが選択。A,B,C,...,Z は任意の文字列。列挙する要素数に制限はありません。各要素は等確率で選ばれる。
ex. (です|ですわ|だい!|だよ|だな)

基本2: 乱数回反復:

(任意の文字列)数字1文字  (但し、数字は1−9)

例えば、 (うお)3 ならば うお が 0-3 回 繰り返される。 回数は等確率で決まる。
ex. つらいよ(〜)3
工夫)2-4 回繰り返したい時は XX(X)2 などとして下さい。

組合せ:

基本は組合わせる事ができます。

ex.1 明日(は|って(さあ(〜)3)1|の天気は)(晴れ|雨(のち(時々|一時)1(台風|雪))1)だって(さ)1。
展開例

明日の天気は晴れだってさ。
明日の天気は雨だってさ。
明日って雨のち一時台風だって。

ex.2 \h\s0これは新トラン(\uんー?\n\h)1スレータDLLの(\u・・・・(なんやねんそれ|すごいんかそれ?) ・・・・\n\h\s3\w8・・・・(うるさいっ!|んーっと・・・・それは・・・・)\w8\nごほんっ・・・・・・・・・・・・\s0の)1デモ用スクリプト(だよ|です(っ|ぅ)1)
展開例

偽: これは新トランスレータDLLのデモ用スクリプトですっ
偽: これは新トラン う: んー? 偽: スレータDLLのデモ用スクリプトですっ
偽: これは新トランスレータDLLの う: ・・・・すごいんかそれ? ・・・・ 偽: ・・・・んーっと・・・・それは・・・・ ごほんっ・・・・・・・・・・・・のデモ用スクリプトですぅ

使い方

本家のホームページにも書いてありますが、ghost ディレクトリの各ghost達のディレクトリに置いてください。
例えば、 sakura/ghost/misuzu/ などです。
上書きすることになるかもしれません。上書きは慎重に

ご使用にあたって

再配布や改造などは、ご自由に行ってください。というか、これが便利だと思われた方は是非とも宣伝してください。
Windows98 でしか動作確認はしていませんが、たいてい大丈夫かと思います。
意図的に悪意のあるコードを入れたつもりはありませんが、 なんらかの不具合があってもお許しください。
何故か、VC++でデバッグモードで使うとフリーズします…(100%再現性があって、でも普通に使うとそこは通過するのでVC++のバグかと)


どうでもいいこと達

文字数制限

変換結果の総文字数が4096文字( byte )を越えるような場合は、どういう動作をするか保証しません。 暴走はしないと思いますが。
「任意」仕様のどこかに、この4096という数字を見たような気がしたので、そうした(そうする方が楽だった部分があった) のですが、
今探してもどこにそんな数字が書いてあったのか…? 簡単にこの制限は変更できますので、ご要望があれば言ってください。

展開処理の順番

makoto basic で置換してから、選択反復が行われます。選択反復処理では、「左からみて最初に見つけた終了括弧に対応する部分から」という感じです。

Makoto Basic

makoto basic で \h \u などを置換すると、それぞれのキャラ用の変換テーブルに切り替わらない事が多々あります。
でも \e などは ちゃんと変換対象にすることができます。

\e,(\nえん(っ)2い(ぃ)4(ー)4|\nえんっっ\u\nうるさい\h・・・・・・・・・・)1\e

とか可能です。

エスケープについて

基本的に '\' でエスケープします。 '\(', '\|', '\)' は '\' が削除された文字に変換されます。
それ以外はそのまま通過します。 '\A' '\u' などは そのままです。
'(^^)' 等を表現したい時は、'\(^^)' です。
'\A'もしくは'\B'という意図で、'\(A|B)' 等を表現したい時は、 '\\(A|B)' です。
'\(^^)' 等を表現したい時は、 '\\\(^^)' となります。
'|' は 括弧() の中でしか解釈されません。 括弧外ならば 普通に '|' を使っても大丈夫です。
開始括弧'(' は 終了括弧')' が無ければ普通の文字として扱われます。
同じく ')' は '('がなければ普通の文字として扱われます。
括弧の後すぐに数字を置きたい時は '(任意の文字列)\3' と'\'を入れればできます。

バージョン情報

TELL_ME_MAKOTO_VERSION
と入力すると、makoto.dll のバージョン名が返って来ます。makoto basicの機能を利用しています。

不具合

文字化け(Ver1.01以前で発生)
「倒、怖、ポ」 などの SJISで 0x7C (`|' の文字)を含んでいる文字を(おそらく)括弧の中で誤認識し、文字化けが起こる(2001/3/15)、との報告がありました。
いわゆる全角2バイト目では 0x7C やその他の制御文字を無視するようにしないといけませんね。

ソースコード

統一感のないソースコードですが、何かの参考もしくは他のmakoto.dllへの組み込みなどを行いたいという方がいるかもしれないので公開します。どのように使っていただいても結構ですが、悪意のあるコードを加え配布することだけはしないで下さい。

更新履歴

Ver.1.02 (2001/3/24)
(この竹の子|あポテト) などが文字化けする不具合を修正。ソースコードを公開。
Ver. 1.01
makoto0.lst, makoto1.lst に空行や '//' 以外にコンマが含まれない行があるとそれ以降を読み込まない不具合を修正。
Ver. 1.0
初期バージョン

注)

  1. makoto basic の細かい仕様がわからないので、単に似せて作っただけです。
    特に、phase2 の「暗号化ファイルに対応」が私には対応できません。できたらおかしいとも言えますね。
    それ以外は、同じような振る舞いをしていると思うのですが…
  2. かなり簡略化しています。正規表現の’+’、’*’ などは展開する事を考えるとかなり凶悪なのでやめ。
    結局、選択と反復をちょっといじったもののみを実装しました。文字クラスとか使えるようにすると、数字をランダムで選ぶ事ができて 結構便利かもしれませんが、とりあえず見送りました。
    ex. うーん、点数は [1-9][0-9]点かな!

私的な話 (しょーもない雑記です)

私が「任意」に初めて出会ったのは、衝撃の公開停止の12時間ほど前、2001年1月30日の昼頃だった。
昔から、「人間っぽい文章生成 」「人工無脳」などに非常に興味があった私は、黒衣氏の仕事は非常に興味深いものだった。
このDLLを作った経緯を、暇つぶしに書き留めておきたい。

まず、任意のメッセージを「あれ以外の何か」といういかしたキャラ に喋らせるSSTP。なんでこんな事を思いつかなかったんだろう…、 と思うほど単純なのだが素晴らしい仕組みである。 (あーと、既に同じようなものがあるのなら済みません、無知なので。とにかく私は感動した。)
絵描き系はさっぱりな私には、非常に遊び甲斐のある玩具を手に入れた気分だった。

次に、黒衣氏のHPを覗いてみると、数々の公開された仕様。さらに、COMMUNICATE と名付けられたメッセージ。この名前から何か黒衣氏の野望のようなものを感じた。感じただけかもしれないが。一気に心惹かれた私は、システムの仕組み、各種仕様を読んでいった。うーん、すごい。
かなり大規模なシステムだと思われるが、それをここまで綺麗に設計・実装するとは…(実は逆で、綺麗に実装しないと大規模なものを作れないという説もあるが…)

しかし、SAKURAスクリプトには 今回提案したような選択・反復がない(エントリを使えばできるが入れ子にしたりすると大変になる)。
これがあると、日本語独特のいい加減な語尾や変化がつけられるんだが…
よっしゃ、ここは黒衣氏に提案してみよう! と思ったが、どうもアイディアを言うだけでは嫌がられそうである。
うーん、困った。いや、困らないか、トランスレータDLLで処理すれば良いわけだな。
久しぶりにVC++でも 起動するか…修論が一段落ついたら。と思ったのが30日であった。

しかし! その翌日 公開停止。活動再開は未定! みたいな、ニュースが。
かなりショックを受けて、知り合いにひたすら文句を言ったのが31日。

大方の見方がそうであるように、 私も黒衣氏が完全に活動を停止したとは思っていない(思いたくない)。氏には是非ともこれからも頑張って頂かねば。
2日の晩に修論draftを提出して時間もちょっとできたし、 いっちょ作るか。で作ったのが3日。C言語忘れかけていて大変だった…

これから、この「任意」がどうなるのかわからない。
でも、人が情熱をかけて作った作品は素晴らしいなぁ、を改めて感じさせてもらったシステムだった。
私もプログラミングに関わる人間として(というか、単に趣味として)情熱を忘れてはいかん! と思いました。
黒衣氏、ありがとうございました。 できれば、今後も頑張ってください。影ながら応援しています。

2001年2月3日