ホーム   SikiWiki 

最近の新規投稿

[SikiLanguage]

式鬼言語 SikiLanguage

Update: 2010-04-03T16:07:01+09:00

航海日誌やってます。

解説始めました。

はじめに

これは、星の数ほどあるスクリプト言語の、さらに別のバージョンのものです。

Forthの簡素さを活かしながら、高い汎用性と高度な応用を可能とする言語を目指します。その代償として安全性・利便性・簡易性を犠牲にしています。

基礎的な部分しか実装していませんので、まだまだ実際に使えるレベルではありません。

基本的な方針

式鬼言語では下記を目指します。

  • 高い対称性を持つ、一貫性のある簡素な原理
    • 対称性の高いデータ構造による汎用性の向上
    • 簡易な動作原理
    • 駆動(二階)の操作手段の提供

式鬼言語の最小構成では下記を考慮しません。

  • 初心者が間違えても問題にならないような安全装置
  • 親切なエラー処理
  • プログラマの意図を先読みするような親切設計
  • 快適な実行環境
  • 過度なシンタックスシュガー

将来的にライブラリなどでカバーする可能性はありますが、最小構成となる核言語に実装することはありません。

特徴

  • Forthの「スタックの不動点に対する操作の連なり」という考え方を拡張し、式鬼言語は「複数のリストから構成されたグラフ(引数グラフ)に対する操作」という考え方で動作します。
  • 全ては命令とデータ構造が一体となった“Cell”で構成されています。
    • 全てのCellには「全ては引数グラフを操作する機械」が含まれます。(Forthの「全ては対象スタックの操作」という考え方を拡張したもの)
    • 全てのCellには下記のデータ構造を含みます。
      • Cellの順番を保存するリスト
      • Cell同士の関係を保存するマップ
      • その他の特性値
      • 他のCellのデータや動作を模倣する委譲の仕組みがあります。
  • ソースコードの解釈もまた式鬼言語の一部として動作します。(TranslatorとTextという2つのCellの連携で実現)

Sourceforgeのページ

http://sourceforge.jp/projects/siki/

解説

参考文献

参考文献はこちら

著作・製作

(C)野分 nowake fiercewinds.net

スペースを@に置き換えて、件名 (Subject:) の頭に[fiercewinds]を置いてメールしてください。





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)



ひぐらしのなく頃に 神落し編

Update: 2010-01-06T02:31:44+09:00

目次


通話記録

「はい、もしもし」

“あら、まだこの番号、通じるのね”

「鷹野さん、ですか? お疲れ様です」

“そんなにかしこまらなくても良いのよ。小此木さん、居るかしら?”

「はい、………………わかりました。少々お待ち下さい」

“時間も無いから早くしてね”

(数十秒の沈黙)

『はい、小此木です。──鷹野さん? 今までどうしたんね。いきなり居のうなっ』

“良いのよ? 今さらそんな取り繕わなくたって。あまり時間も無いから一言だけ。番犬を上手くあしらって貰いたいのだけど”

『──どういうことですか? なぜ番犬が……』

“あら、判っているでしょ? 番犬は既に高津戸地区付近に展開済のようね。これからどこに向かうつもりかしら? くすくすくす”

(数秒の沈黙)

“あらあら、本当にご存知ないのかしら? 『野村』も罪な人ね。 くすくすくすくすくす”

『番犬は最悪の事態に備えて待機していると聞いています』

“本当にそうかしら? くすくすくすくすくすくすくすくすくす。『最悪の事態』で番犬に追い立てられるのは誰かしら? 私? それとも──山狗?”

『番犬は雛見沢住民の暴動が早期に発生した時に備えて待機していると聞いています』

“あなたも気付いているのではないのかしら? くすくすくすくすくすくすくすくすくすくすくすくす。『野村』は女王感染者の死亡による急性発症なんて信じてはいないわ。『野村』が自分の信じていないことのために番犬を出動させるというリスクを犯すかしら?”

(数秒の沈黙)

“まあ、建前上、『野村』が番犬にそう指示している可能性はあるわね。「女王感染者死亡に備えて待機せよ。女王感染者の死亡が確認されたら、至急事態の収束を図れ」といったところかしら? くすくすくすくすくす────────────でも、もしも本当に女王感染者の死体が見付かったら…………どうなっちゃうのかしら? 山狗どころの話じゃなくなっちゃうわね”

(数秒の沈黙)

“梨花ちゃん──女王感染者だけど、どうも鬼ヶ淵に向かっているみたいね。鬼ヶ淵の底に沈んで隠れるつもりかしら? 底無し沼という噂もあるし。くすくすくすくすくす──────もしも女王感染者の死体が必要だったら、急がないと二度と手に入らなくなるわね”

『──信じられない──裏切り者の言うことなんて────』

“あら、それはお互い様じゃないのかしら? 裏切って裏切られてまた裏切って───くすくすくすくすくす。だけど、お互い番犬から逃げ切らなくちゃいけないから、そのための駒は有効活用しなきゃいけないんじゃないのかしら?”

『──────信じられない』

“まあ、良いわ、ダメならダメで。自分の身一つなら何とでもなるわ。──────山狗みたいな組織になると逃げるのも大変ね”

『───信じられない』

“上手く逃げられたら、またどこかで会いましょう”

『───信じ───られない』

(通話終了)

(続く)





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)



ひぐらしのなく頃に 神落し編

Update: 2010-01-06T02:31:32+09:00

目次


沙都子3

かすかに光の気配を感じました。

あたりはまだ真っ暗ですが、間も無く夜が明けようとしています。

くらやみにつつまれた裏山を小さな手灯りだけで走りまわったせいか、手足がすりきずだらけになっています。わたくしは暑苦しさにがまんができなくなり、頭にかぶった黒髪をはずします。そのしなやかな黒髪は、本当に梨花の黒髪にそっくりです。

「梨花は…………大丈夫でございましょうか……」

つい、口にだしてつぶやきます。そうつぶやいてから、わたくしは自分のバカさかげんに気付きます。────ここには山狗というおそろしい暗殺部隊がひそんでいるのです。

わたくしの役目は梨花に化けて山狗をこの裏山に引き付けることです。……そして、もし梨花が裏山にやってくるようならば、山狗よりも先に梨花をつかまえなくてはなりません。

わたくしはあたりを見まわします。息をころしてうごめく山狗たちの気配を感じますが、まだここまでは来ていないようです。わたくしはもういちど黒髪をかぶりなおします。

けっきょく、梨花は裏山には来なかったようです。梨花は、どこに逃げこもうとしているのでしょうか。わたくしは自分の右手を見ます。まだ、自分の手に梨花のぬくもりが残っているような感じがします。しかし、そのぬくもりも、あとしばらくすれば無くなってしまうでしょう。わたくしは、それが二度と手に入れることのできないぬくもりのように感じました。

ぼやける視界を右腕でぬぐうと立ち上がります。長い時間留まりすぎたようです。わたくしは場所を移動することにしました。

しかし

わたくしは動くことができませんでした。

「沙都子……ちゃん?」

背後から、とても強い臭いがします。その臭いが、わたくしの背後をおおいつくし、さらにはわたくしを押し潰そうとします。わたくしは、むりやり膝の力を抜くと、倒れるようにしながら前に転がりこみます。

頭のすぐ上を丸太のようなものが通り過ぎます。わたくしは転がるいきおいをそのままに木の裏に走りこみます。

からだを支えようと突き出した左手に生あたたかい感触が伝わります。そこには、動かなくなった大人──たぶん山狗でしょう──がいました。

「僕を邪魔する悪い奴等には、少し大人しくなってもらったのさ。これでゆっくり話ができるよ。────沙都子ちゃん」

見上げると、そこには富竹さんがいました。しかし、わたくしにはそれが富竹さんだと思うことができませんでした。それは、何か──人の形をした何か別のもののように感じました。

「……お、に────」

その何かの口元が大きく──おぞましくゆがみます。

「鬼、とは酷いなぁ。沙都子、ちゃん。何を──そんなに怖がっているんだい? もう、沙都子ちゃんを脅かす悪い大人たちはいないのに」

わたくしは少しずつ、富竹さんの姿をした何かに気付かれないようにしながら少しずつ姿勢を変えていきます。膝のタメを作り、足場を固め、タイミングを……今!!

しかし

それもダメでした。

目の前に富竹さんらしき顔が現れます。わたくしは不意に現れたその顔にたちすくみます。

「逃げようと──しないで、教えて欲しいな。この……雛見沢で、一体何が起きているんだい? …………鷹野さんは、どうしたのか知っているかな?」

わたくしは絞り出すようにして返事をします。

「知りません……ですわ。わたくしは、梨花を探しているだけのことですのよ」

「梨花──ちゃん、かい?」なまぐさい息がわたくしをなめまわします。「梨花、ちゃん、か。僕も会わなかったな。この近くにはいないようだね」

その何かはわたくしから顔を離すと、遠くの方──鬼ヶ淵の方を向きます。

「そう、だね。僕も、梨花ちゃんに聞きたいことがあるんだ」歪んだ笑みが、狂気に染まります。「なぜ僕に、鷹野さんに、こんな意地悪をするのか教えて貰わないとね」

その邪悪な笑み。梨花を八つ裂きにして喰らいつくそうとする鬼の姿。それだけは……許されないのです。

わたくしは、鬼の足元を走り抜けると同時に、近くに仕掛けたトラップを発動します。仕掛けから解放されて振り子のように振れる丸太。丸太は狙った通りに鬼をなぎはらいます。

いえ

なぎはらおうとしただけでした。

丸太は鬼にぶつかると、大きな鈍い音を立てて不自然に止まります。丸太の向こうから怒りに歪む鬼の形相があらわれます。

「沙都子、ちゃんも、こんなイタズラをしようとするのかい? 意地悪は……いけないな」

わたくしは富竹さんだった何かに背をそむけると、鬼ヶ淵に……梨花がいるという鬼ヶ淵に向けて走り出します。

この鬼を梨花に会わせてはいけません。この鬼は梨花に危害を加えようとしています。それは何としても防がなくてはなりません。しかし、わたくしにはこの鬼を止めることができません。

「どうすれはよろしいのでございましょうか──?」

わたくしにはわかりませんでした。

(続く)





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)



ひぐらしのなく頃に 神落し編

Update: 2010-01-06T02:30:32+09:00

おやおや、ようこそ。終わりなき永遠と無限の世界へ。心より歓迎いたします。

『私も歓迎するわ。二人っきりじゃさみしいところだったから』

まずはコーヒーをどうぞ。深煎りしていますので、苦手でしたらミルクを多めにして、ゆっくりとお楽しみ下さい。

ゆっくりとおもてなししたいところですが……残念ながらあなたを愉しませることができそうなものは、ここにはあまりありませんので……

『そうね。……この前のお話なんてどうかしら? あれは私のとっておきの宝物なんだけど』

あれはちょっと甘過ぎるかも知れませんが……でも、そのコーヒーには合うかもしれませんね。

では、少し用意してきましょう。気に入るといいのですが……。

『ちょっとお腹にもたれるかも知れないけど、私は好きよ』

ああ、ああ……物置の奥の方にいっていますね。ちょっと全部出すのは時間がかかりますので、順番にどうぞ。

『その前に注意事項ね』

おっとっと、そうでした。

まずは……このお話は、“ひぐらしのなく頃に”“ひぐらしのなく頃に 解”を元にした、もう一つの“祭囃し編”です。

“祭囃し編”の最後のカケラと、竜騎士07さんのBBSの:『二次創作の公認について』(2006/08/22(Tue) 11:33)に後押しされて出来たお話です。

【まず結論から申しまして、当サークルが二次創作に対して「公認」を与えることはありません。ですが同時に「不可」を与えることもありません。】……何と優しい言葉なのでしょう。原著の竜騎士07さんには最大限の感謝をいたします。

また、もう一つの“祭囃し編”という性格上、“ひぐらしのなく頃に”“ひぐらしのなく頃に 解”のネタばらしがたくさんありますので、読了していないひとの閲覧は禁止します。また、エピソードを流用しているケースも多いので、お気を付けください。

また……できるだけ“ひぐらしのなく頃に”の設定を壊さないように調整していますが……設定の解釈ミス・キャラクタの言葉使いの間違いがありましたら、下記の要領で指摘してもらうと助かります。

……いや、けっこういじってますな。特に小此木さんの所は。

まあ、それは“祭囃し編後半”をリセットした、ということで勘弁してください。

野分 nowake fiercewinds.net スペースを@に置き換えて、件名 (Subject:) の頭に [fiercewinds]を置いてメールしてください。 感想とか誹謗中傷はご容赦下さい。

『私からも一言いいかしら? このお話はとても甘いお話。ミステリーとかサスペンスを期待する人にはちょっと口に合わないかもね。SFと幻想が嫌いじゃなければいいんだけど』

それは私の希望でもありますね。

では……御笑納頂ければ幸いです。

  • (続く)

変更履歴

  • 2008/03/31 『魅音3』を追加。まずは部活メンバーのターン
    「ジミな展開だね~~」
  • 2007/12/24 『富竹2』を追加。なかなか先に進まないのでちょっと回り道
    「混乱に混沌を追加といったところだね。どうなることやら」
  • 2007/11/12 『詩音1』を追加。終盤はキツい……これで話が回り始めれば!
    「何やっているんですかね」
  • 2007/08/30 『魅音2』を少し修正
    「これで少しはカッコが付いたかな?」
  • 2007/08/25 『梨花2』を追加。終盤の開始です。
    「みー、痛いのです」
  • 2007/08/18 『沙都子1』『沙都子2』を追加。ようやっと中盤終了
    「これから一体どうするのでございますのよ!!」
  • 2007/08/15 『魅音2』を追加。しんどいな……この辺が一番書き辛い
    「ひゃー、色んな意味でキツいね」
  • 2007/08/13 『魅音1』を追加。魅音は掴み辛い……自分と似たキャラだと思うんだけどな……
    「長かったね。これからはずっとこんな調子だろうかね」
  • 2007/03/26 『小此木3』を復活。こんな感じかな?
    「ずいぶんと難産やったね」
  • 2007/02/11 『レナ1』を追加
    「一気に行かなきゃね」
  • 2007/02/06 『小此木3』を削除。これはヤバいよ
    「なんね~~~!」
  • 2007/02/06 『鷹野4』を修正。
    「あらあら、辻褄合わせね」
  • 2007/02/04 『小此木3』を追加。
    「こっちも正念場に入ったんですんね」
  • 2007/01/16 『茜1』を追加。難産でした、姐さん……
    「いまいちかねぇ。もうちょっと遣り様があるだろうに」
  • 2007/01/07 『鷹野5』を追加
    「私は、いったいどこに行くのかしら?」
  • 2007/01/07 『富竹1』を追加
    「さてさて……物語は混沌に包まれつつあるみたいだね」
  • 2007/01/04 『梨花1』を追加
    「ボクにも選択肢があるというわけね。どうしようかしら?」
  • 2006/12/12 『鷹野4』を追加
    「そろそろ物語が回って来たわね」
  • 2006/12/03 『茜1』を削除。姐さんごめん
    「ぬぁんだってぇ~~」
  • 2006/12/03 『入江1』を追加
    「『あの父』は誰だったのかというところまで踏み込みたい気もしますが、そうなると話が脱線しますね」
  • 2006/11/04 『羽入3』を少し修正
    「いくらなんでも、あれでは魅音がマヌケすぎるのです」
  • 2006/11/04 『鷹野3』を追加
    「おつかれさま。簡単な話だったのに、なんかすごい展開になっちゃったわね」
  • 2006/10/30 『小此木2』を追加
    「粛々と進みますんね」
  • 2006/10/29 『圭一1』を修正
    「エピソード追加か……。追加部分を見ると、作者としての狙いが透けて見えるよな」
  • 2006/10/21 『鷹野1』を追加
    「話は広がるばっかりだわ。ねえ、どう締めるつもり?」
  • 2006/10/20 折り返し地点の『悟史』を追加
    「ここまで行くのは……いつになるんだろうね」
  • 2006/10/20 『圭一1』を追加
    「ようやっとかよ。長かったな」
  • 2006/10/14 『小此木1』の順番を入れ替え。
    「ここでタイムテーブル調整が入るんは、ちょっと酷いんでない?」
  • 2006/10/14 まだまだ時間がかかりそうなので、変更履歴をつけることにしました
    計画性がないのはご容赦……




制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)



ひぐらしのなく頃に 神落し編

Update: 2010-01-03T23:57:44+09:00

目次


魅音2

長老たちはこの状況を待っていたのか。私は今さらながら気が付いた。

「最近調子わるいんでなぁ。このまま失礼させてもらうんね」

婆っちゃがそういうと、母さんは車椅子を押して部屋の中に入ってくる。婆っちゃは私の方を見ようとしない。代わりに母さんが視線で私を縫い付けようとする。

喉が乾く。身体が硬ばる。私は皆に気付かれないように、ゆっくりと深呼吸する……が、効果は薄い。

「ありゃ、なんか忙しいんかい? 何なら終わるまでのんびりさせてもらうけど?」

と母さん。なぜか持って回った言い方をする。

老人たちの間から沸き起るざわめき。内容は良く聞き取れないが、この話題から離れられることを喜んでいる声が多いように感じる。機先を制しないと無理矢理終わりにさせられてしまうだろう。

私は婆っちゃと母さんに状況を説明しようとするが、村長の方が先に発言しはじめた。

マズい。何とか割り込まないと…………と思ったが、何か勝手が違う。

「いやね、お魎さん。魅音ちゃんたちがね、相談したいことがある、ということで話を聞いているところなんだよね。──ちょうどいい。お魎さんも聞くかい?」

長老たちは戸惑いを隠せずに成り行きを見ている。終わると思っていた話題を村長が続けようとしている。やはりそれは長老たちの考えていなかったことのようだ。

「なんじゃぁ。みなでコソコソやりよってちゃぁ。もちっと待っとりゃええものを」

村長の下座の長老が場所を譲ると、婆っちゃと母さんがそのままそこに入る。長老たちは順繰りに移動し、輪が一回り大きくなる。長老も少し横に移動した関係で、正座する私の正面に婆っちゃが、その横に母さんと村長が居る形になっている。

婆っちゃが私たちを見回し────沙都子を確認すると突然叫び始める。

「なんじゃあ!!!なんで北条の糞餓鬼がここにおるん!!この罰当たりもんがぁ!!」

反射的に首を竦めそうになる。

怖い、怖い、怖い! 怖い!! 怖い!!! ────怖い!!!! 婆っちゃに対する恐怖は骨の芯まで染み付いているのだ。心が掻き乱され、頭を引っ掛きまわされて考えることができない。怖い、怖い、怖い! 怖い!! 怖い!!! ────でも、ここで崩れるわけにはいかない。

何とか平静を保ちながら、さらに暴言を続けようとする婆っちゃに割り込もうとする。

「沙都子のことでお話しがあります。わ 「北条の罰当りもんと話すことなんぞないわ!!ケガらわしっ!!!なに言っとるんじゃあ!!!!」

婆っちゃの罵詈雑言を受けながら…………私は普段とは違う違和感を感じていた。

普段の私ならば身を投げ出して謝り続けているだろう。理不尽であっても不合理であっても関係ない。臆病者の私にできることなんてそんなことぐらいしかないのだから。

しかし、今回は違う。横には私を頼りにしてくれる沙都子がいる。沙都子は変わらずに正座をしておじぎをしている。とても小さく儚げな姿。もし、私が全てを投げ出して逃げ出したとすれば、沙都子はどうすれば良いというのだ? 雛見沢の住民だけではなく、信頼している仲間からも見捨てられたとしたら……その深い絶望など想像したくもない。

しかし、今回は違う。後ろには頼りになる仲間たちが私を支えてくれる。仲間たちが、毅然とした態度で構えていることを背中に感じる。その上で、私を信頼して事の成り行きを見守っている。その視線はとても暖く……そして厳しい。大事な仲間の前でみっともないことなんかできるはずもない。

そして、今回は違った。私は婆っちゃの叫び声の中に怒りではなく、狂気を感じる。

なぜ?

「なにぎゃあぎゃあ言うんな、くだらんわ!!! この大事な段取りに、なんちゅうもん持ってくるん!? このバぁタレが!!!!」

怒っているのではない……恐れている?

「魅音さんのおばあさん。わたくしがあの人のおこなったことを謝りますのですわ。わ 「だあほ!! 調子に乗りおって!! 何を言うん!!!」

婆っちゃが沙都子を怒鳴りつける。しかし、けっして沙都子を見ようとしない。

婆っちゃは沙都子を恐れている? なぜ??

…………そうか、沙都子を恐れているのではなく……穢れ……『祟り』を恐れているのか。ストン、と腑に落ちる。

そう思うと、婆っちゃの昔の行動にも納得の行くものを感じる。かつてあれだけ熱心に『オヤシロさまの祟り』を調べていたのも──そして急に調査を止めてしまったのも、『祟り』を恐れていたからなのだろう。

さらに罵詈雑言を続けようとする婆っちゃを、鋭い声で刺し殺す。

「当主!!そんなに『祟り』が恐ろしいの!?──園崎家当主ともあろうお方が!!! なんとみっともない」芝居がかった口調で言う。あえて当主という言葉を使う。少しヒステリックに聞こえたのかもしれないとも思ったが、何にせよ婆っちゃの口を止めることができた。「詫びを入れようとしている相手を罵るのが園崎家の礼なのですか? ありもしない『祟り』を恐れて」

「なんば言うよっとかすったらん!!! だあっと聞いとん、くだらんわ!!! おい、茜ぇ、帰るぞ!!!!」

その言葉を引き止める。

「それは──当主代行に任せるということですね?」

婆っちゃが深い闇の色をした瞳を私に向ける。その視線に刺し貫かれて、私は身動き取れなくなる。鼓動が早く強くなる。顔が火照り頭に血が上る。

怖い、怖い、怖い──。

「なぁん?」

「この件を、園崎家当主代行である私に全て任せるということですね。『北条家』の詫び入れの件を」

婆っちゃが何の表情も見せずに私を睨み付ける。

怖い、怖い、怖い、怖い、怖い、怖い

肩は震え、声を出すのもままならない。婆っちゃもたぶん気付いているだろう。私の臆病の虫が顕れてきていることを。だけど──このまま引き下がるわけには、逃げ出すわけにはいかない。

逆に、婆っちゃは顔色一つ変えずにじっとしている。まるで……灯り一つ無い闇を見ているようだ。

「魅音よぅ。そりゃあ、どないっちゅうことが? 『園崎』が『北条』に肩入れする、ちゅうことがぁ??」

私は、何とか最低限の部分だけ腹から絞り出す。みっともないほどに震えた声。

「──────私が────沙都子を──悟史を──助ける、ということです」

婆っちゃの顔に、再び狂気の色が浮んで来たような気がした。──鬼の顔、という言葉が心に浮かぶ。怖い、怖い、怖い、怖い、怖い、怖い。そのまま心を鷲掴みに喰われてしまいそうな、生きたまま粉々にすり潰されそうな──怖い、怖い、怖い、怖い、怖い、怖い。

無限に続く時間の中、私と婆っちゃは睨み合う。身動き一つ取れない。

言葉を継ごうとするが、もう一言も出て来ない。

婆っちゃも、何も語らずに身動き一つしない。

──長い時間がたった。

──いや、本当は少しだけの時間だったかもしれない。

「くだらねぇ」

背後から声がする。

「つまらねえ話ばかりしやがって」

圭ちゃんが立ち上がる。そのまま、腹に響く声で語り始める。

「『北条』だの『園崎』だの、『ダム戦争』だのっ、『祟り』だのっっ、つまんねえことをグダグダぐだぐだいつまでも引っ張ってんじゃねえっっっ!!!」

婆っちゃが圭ちゃんを睨み付ける。しかし、圭ちゃんはそれを真っ向から受けて怯まない。

「沙都子の両親が死守同盟と敵対して雛見沢の恨みを買っていることは知っている。沙都子の父親が園崎家に暴言を吐いたこともな。だから、それがどうしたっていうんだっ!!」

圭ちゃんは右手で空気を薙ぎ払う。

「 くだらねぇっ!!! 直接関わったわけじゃない沙都子が一歩身を引いて謝ろう、やり直そうとしているじゃねえかっ。なぜ素直に受け取ろうとしねえんだっ!! 俺はこの雛見沢に来て、みんなに優しくしてもらって、すぐにみんなの仲間になれて嬉しかった。とても嬉しかった!!! 俺みたいなつまらない人間がすぐに雛見沢に馴染めるとは思わなかった!! とても嬉しかった!!! なのに何でそれが沙都子じゃいけねえんだ!!!」

ダン、と圭ちゃんが一歩踏み締める。

「5年前から綿流しの日に死者が出ていることも知っている。皆が『オヤシロさまの祟り』と呼んでいることも、『北条家』の、沙都子の両親、叔母、悟史が巻き込まれていることも知っている。それがどうしたっていうんだっ!!!」

長老たちを射竦めながら、圭ちゃんは言葉を続ける。

「『オヤシロさまの祟り』?? 馬鹿馬鹿しい。雛見沢の住民どもは何を見て来たんだ?? オヤシロさまは、鬼でさえ許して仲間にしたんじゃねぇかよっ!! そんな優しい神様が、終わった『ダム戦争』を呪って『祟り』なんて起こすわけねぇだろっっ!! そんなことも判ってやれないのかよ!! ここの連中は!!!」

圭ちゃんはもう一度婆っちゃを睨み付ける。

「沙都子が『穢れている』だぁ? どの口がそんなことを言いやがるっ!! 沙都子を穢しているのはアンたらの心だっ!!! アンたらの疑心暗鬼に塗れた心が、沙都子を生贄に仕立てあげて安心したいだけじゃねえかっ!!!! 沙都子は穢れてなんていねえっ!!! それはカビの生えたアンたらの偏狭な脳味噌の幻覚じゃねえかっ!!!」

拳を固く握り締める。

「『北条家の人間は呪われている』だぁ?? くだらねえ!! くだらねえ!!!! くだらねえ!!!!!! 沙都子は『北条家』じゃねえ!!! こんな小さな肩に何を負わせようとしやがるんだ!!! 沙都子は『沙都子』だ!!! ジジババどもの都合を押し付けるんじゃねぇっ!!!!」

圭ちゃんの言葉がそこで切れる。柱時計の音だけが、静かに刻を刻む。

沙都子が弱々しい声で呟く。クスン、クスンと、言葉を涙で切りながら。

「──わたくし、『北条』なんて名前はいりませんのですわ。──みんなと仲良く暮らせるのなら……にーにーと……一緒にいられるのなら……雛見沢にいられるのなら…………『北条』なんて名前はいりませんのですわ」

再び静寂。

短くて、長い静寂。

「私が、沙都子を、悟史を、助けます」私は繰り返し言う。「私がです」

負けられない。

「それは、どういうことだい? 魅音」

今まで沈黙を守っていた母さんが、とても冷たい声でそう言う。その言葉は、私が必死に抑え付けている臆病の虫を抉り出そうとしている。

しかし、負けるわけにはいかない。

「私は、『北条家』……いえ、『沙都子』の覚悟を受け容れます」私は母さんを睨み返す。それはとても怖かった──けれど、もう怖くなかった。「沙都子は私の仲間です。かけがえのない仲間なのです。──沙都子に敵対するものは、私の敵です。それが誰であったとしても」

私はゆっくりと息を吸う。今までの自分からは信じられないほど凪いだ心。背中には仲間の力を感じる。この戦いに負けるわけにはいかない。脇に沙都子の温もりを感じる。この温もりを失うわけにはいかない。

「そう、」私はゆっくりと立ち上がる。「たとえそれが──園崎家当主であったとしても。私たちに敵対するのならば、私は必ず敵を打ち倒します」驚くほど緩やかな身体。今ならば全てのものに手が届くような気がした。

私は長老たちを見る。

長老たちは私と目を合わせようとしない。長老たちは何も変わらない。長老たちは何も変えられない。年寄りにはもう残された時間が無い。だから私を肯定も否定もできない。

「そう、」私は言葉を続ける。「たとえそれが──雛見沢全てであったとしても。私たちに敵対するのならば、私は必ず敵を打ち倒します」誰も私の言葉を遮ることができない。

私は再び婆っちゃを見る。

今の婆っちゃは、──信じられないほど小さな、とても弱々しげな老人でしかなかった。恐怖に囚われて身動きの取れなくなった、可哀想な年寄りでしかなかった。

「そう、」私は言葉を続ける。「たとえそれが──『祟り』であったとしても。私たちに敵対するのならば、私は必ず敵を打ち倒します」

今の婆っちゃは、ただの年寄りでしかなかった。私の全てを飲み込もうとしていた眼光も、今は虚ろなきらめきでしかなかった。

母さんが婆っちゃに耳打ちする。婆っちゃは身動き一つ取らない。石のように固まったままだった。──しかし、この沈黙も、長くは続かなかった。

「よぉうわかった」

婆っちゃが、とても弱々しく寂しげな声でそうつぶやいた。

「おんしらの覚悟…………見してもらおかいな」

その言葉は、どこからともなく伝わってきた風鈴の音で締めくくられた。

(続く)





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)



ひぐらしのなく頃に 神落し編

Update: 2010-01-03T22:26:47+09:00

目次


『野村』

何時の間にか眠っていた。軽く頭を振ると、椅子に座り直す。

さて、どうしたものか。現在の状況をもう一度頭の中で整理する。

当初の計画は明らかに破綻している。T、Iの失踪、警察の介入。大幅な計画の遅れ……本来ならば計画を破棄し撤退すべき状況だ。

だが、ここに来て局面は新たな展開を迎えた。女王感染者が重体のまま行方不明になるという異常事態。そして、破綻した計画を一気に押し進める数少ない機会。

女王感染者の異常と失踪。これは緊急マニュアルの想定する非常事態と解釈できる。シナリオを大きく修正する必要があるが、大目標となる緊急マニュアル発動に繋げることも可能だろう。

しかし、私は迷う。

決行する時の問題は三つ。

一つは、時間。女王感染者の死が計画よりも24時間以上早い。まだ敵対派閥の閣僚の一部が東京に残っている。この状態で実行を前倒しすれば介入されるリスクが大きい。そしてそのまま失敗すれば格好の攻撃材料となるだろう。それを避けるためには、山狗を使って女王感染者の生存情報を流し、死亡時刻が計画時刻になるように操作する必要がある。

一つは、体制。緊急マニュアル発動の前倒しを行うにしろ女王感染者の死亡時刻を操作するにしろ、現在の計画を大幅に修正する必要がある。しかし、今までの計画の大幅な狂いから山狗含め関係者の多くが少なからず混乱した状況にある。この状況で計画の変更を行うには多大なリスクを負わなくてはならない。また、Tの失踪も危険な状態を引き起こす可能性がある。もし敵対派閥がこの情報を入手したら、用心のため閣僚の外遊や静養を取り消して東京に残るだろう。閣僚の動向を観察するための人員を配置する必要がある。

一つは、対象。雛見沢には村人だけではなく興宮警察の署員も存在する。署員が雛見沢に詰めている状態では雛見沢地区を外部から遮断するのは難しい。そして、村人によるRの捜索が続いている間は署員が雛見沢から撤収することはないだろう。“終末作戦”を実行するためには迅速かつ確実に署員を排除する必要がある。

しかし、撤退は撤退でリスクがある。

作戦失敗による信用の低下。これだけ規模の大きい作戦を完全に失敗してしまうのは大きな損失だ。準備にそれなりの費用を投資している。ある程度の責任追求は避けられないだろう。撤退するならばもっと早い段階で手を打つ必要があったが、迂闊にも判断を遅らせてしまった。致命傷にはならないだろうが、非常に危ういところにいる。だが、しかし────

電話の呼び鈴が鳴る。

時計を確認する。小此木からの報告の時間だ。思考が中断されたことに少し苛立ちながら受話器を取る。

「はい」

「鳳2です。鳳1から報告があります」

「判ったわ。繋げて」

しばらくの沈黙。

「鳳1です。状況を報告します」

自衛官らしくない物言いで小此木が状況報告をする。

雛見沢の状況は前回報告から進展なし。未だにR、I、T及び雛は発見できず。雛見沢には興宮警察が入り込み、村中総出で山狩りが行われている。

深く溜息をつく。

Rの死亡が確認されていない。まだ可能性は残っているが……どうする?

既に打てる手は一通り実行している。情報整理、作戦修正案の検討、関係者への打診────また、奥の手として番犬を演習名目で雛見沢近くに移動させている。決行するにしろ撤退するにしろ、番犬を活用するのが確実だ。また、もしも本当に一斉急性発症の兆候が見られたとしても、迅速に雛見沢に展開し、封鎖することができるだろう────まあ、一斉急性発症などという与太話が現実になることは百万に一つも無いと思うが。

「山狗の消耗はどんな感じなのかしら」

「あまり芳しくありません。以前より人員が足りていないのは報告通りです」

もう一つ深く溜息をつく。今から東京の人員を雛見沢に送っても間に合わないだろう。どうやらツキも無いようだ。人事を尽して幸運が得られないというのならば…………

仕方がない。

私はもう一つの消極案──雛見沢の情報収集のみ継続し、タイミング良く予定時間通りにRの死亡が確認できた場合のみ緊急マニュアルを発動する──で進めることにした。十中八九“終末作戦”は廃棄になるだろうが、致命的な失敗よりも取り返しの効く失敗の方がまだましだ。閣僚の動向確認を行う必要があるが、幸い東京には山狗が多数来ている。再配置はそれほど難しく無いだろう。それならば────

小此木が口を挟む。

「確認──よろしいでしょうか」

私は考えを遮られたことに対してさらに苛立ちながらも小此木を促す。「何。どうしたの?」

「番犬は……、いかがいたしますか?」

その声に何か不気味なものを感じる。

「別にどうしようもしないわ。待機のままよ」

なぜ?

なぜ小此木はそんなことを気にするのだろうか?

「…………撤収ではないのですね。」

撤収? 一体なんのことか?

「小此木、どういう────」

「残念です」

背筋にぞくりとしたものが走る。小此木の声に染み付いた微かな違和感。

それが狂気であることにようやっと気付いた。

「────とても──────残念です」

受話器を置き、振り返ろ…………うとしたが、そこまでだった。

身体に走る衝撃。重たいものが叩き付けられる音。目の前に現れる複数の軍靴。

床の冷たい感触。ぬける力。

そして、とまる、

(続く)





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)



ひぐらしのなく頃に 神落し編

Update: 2009-12-29T03:02:44+09:00

目次


魅音3

園崎本家の広間。

私は机を並べると、手に持つ地図をその上に広げる。

誰にも気付かれないように静かに深呼吸をする。

沙都子が心配そうに私の顔を覗く。私は沙都子の頭を軽く撫でる。

広間の片隅で、詩音がレナと圭ちゃんに状況の説明をしている。羽入は見つからない。入江も見当たらない。

私たちは、あのあとすぐに診療所を抜け出してそのまま園崎本家の屋敷に移動した。すでに梨花ちゃんがいない以上、あの場に留まる利点は少なかった。確かに移動する時間は貴重だけれども、敵地──『東京の転覆派』の拠点の中に居続けるリスクは犯したくなかった。しかたない。ただ、時間のロスは最低限に済ませることができた。呆然とする私を尻目に詩音が上手く立ち回ってくれなければ、いまだに診療所の中でもたついていただろう。

遠くで葛西の声が聞こえる。葛西が園崎組の手下を連れて現れる。詩音は圭ちゃんたちへの説明を中断し、二言三言指示を出す。私はその詩音の姿をとても頼もしく感じると同時に、……少し胸を締め付けられるような感触を覚える。もし、……もしも…………いや、止めておこう。そんなことよりも、今は目の前のことに集中しなくてはならない。

葛西は詩音の言葉を受けて、私の近く──地図から少し離れた机の片隅に無線機を設置し、携帯無線機を並べる。さらにその横に、私が地図を持って来るときに忘れた文房具一式を置く。私はさっそく大き目のカラーマグネットを地図の主要地点に置いていく。カラーマグネットはカチリと地図にへばり付く。私はその時に初めて机が鉄製だったことに気付く。

────広い。

雛見沢の地図を目の前にして、私は思う。そう広くない山間に散在する住宅。細々と繋がる道。……そして地図の多くを占める田畑と──山。

この広大な雛見沢の中から、逃げ回る梨花ちゃんを捕まえなくてはならない。…………捕まえられるのだろうか? 私には確信は持てなかった。だが、捕まえなくてはならない。さもないと……………………………………さもないと……………………

………いや、目を逸らすのは止めよう。たとえそれが最悪の可能性だったとしても。

そう、できるだけ早く捕まえないと、梨花ちゃんが死ぬ。

そうだ。死ぬんだ。可能性はかなり高い。

診療所の病室に残された空の注射器。それを見たときの入江の狼狽。

問い詰めてようやっと吐き出させた言葉。

『雛見沢症候群を強制的に末期発症させる薬』

──────あぁ。そうだ。梨花ちゃんは今、狂気に冒されようとしている。早く捕まえないと雛見沢症候群の作り出す疑心暗鬼に心を焼き尽されるか、あるいは自ら喉を掻き毟るか。梨花ちゃんは今、雛見沢症候群の作り出す妄想に追い立てられ、闇に沈む雛見沢を逃げ回っているのだろう………………いや、

いや、…………違う。目を逸らしてはいけない。たとえそれが望まない可能性だったとしても。思わず膝が笑う。私はわざとらしく振り返ると葛西の置いた椅子を引き寄せて腰掛ける。まだ震える膝を無理矢理押さえ付けると、再び地図に向かう。

違う。梨花ちゃんは逃げ回っているんじゃない。────死に場所を求めているのだ。誰も見つけ出せない、──少なくとも48時間以上は見付からない場所。『自衛隊の殲滅作戦』の“『女王』の死後48時間以内に感染者全員が末期発症する”という仮定を否定する手段の一つ。

もし、そうだとすると、なんと────愚かなことなんだろう。

もう、手遅れなんだ。私はカラーマグネットを主要地点に置きおわると、今度は梨花ちゃんの捜索の手駒として使える人員を見積り始める。

梨花ちゃんは判っていない。たとえ死体が見付からなくても、今となっては大した話ではない。診療所に入院していた事実。急激な体調不良。そして失踪。────『女王』の異常を示す十分な証拠。これだけあれば、梨花ちゃんの死体の有り無しにかかわらず、『女王』が危機的状況にあることを結論付けることはそんなに難しいことではない。そして、もしそこに『梨花ちゃんの死体を発見した』との“連絡”があれば────真実である必要はない。それらしい情報であれば十分だ。きっかけさえあれば、全ては再び回り始めるだろう。

確かに強引な方法ではあるが────。しかし、梨花ちゃんの失踪は『東京の転覆派』に対しても二択を付き付けてしまった。『自衛隊の殲滅作戦』を強引に実行するか、作戦自体を闇に葬るか。延期するという選択肢はありえない。作戦を再開するために必要不可欠な『女王』が失われようとしているのだから。そして“終末作戦”の実現を望む存在──鷹野さんが、この千載一遇の機会を逃すはずがない。

『東京の転覆派』はどちらを選択するだろうか?

私には判らなかった。

人員の見積りが終わる。希望的観測も含めて見積ったにもかかわらず、それでもなお足りない人員。でも、これで何とかするしかない。

「詩音」私は葛西と話をしている詩音に声をかけると椅子から立ち上がる。「圭ちゃんもレナも来て」

葛西と沙都子も含めた6人で地図を囲う。私はテーブルに積まれた携帯無線機の周波数を合わせ、全員に配る。ホルダーとイヤホンの取り付け方や簡単な使い方を教えると、実際にお互いに通話してもらう。

「時間が無いから細かい所は説明しないけど、これで通話はできると思う。他のところをいじくっちゃダメだよ。電波の状態によって聞き取れなくなることもあるけど、その時は諦めて」

この無線機による情報こそが私たちの命綱になるんだけれど…………仕方無い。

「まず、詩音」私は詩音と葛西の方を向く。「雛見沢のみんなと一緒に山狩りを行って。葛西たちも一緒に。場所はここと、ここ、……ここを、こうたどって」私はテーブルの空きスペースにもう一枚地図を広げると、比較的安全な地域に矢印を書き込んでいく。安全だが、……とても広大な地域。

「その範囲だと────とても人手が足りません。全てを確認するのは無理ですね」詩音が口を挟む。

「うん、判ってる。雛見沢中のみんなを掻き集めてもたぶん足りないだろう。──だけど、それでもやらなきゃいけない」私は頭を上げる。詩音の冷たい表情。「ただ、山狩りするときは、できるだけ賑やかに騒々しく歩いて。遠くに居てもわかるように。みんなに鳴り物を持たせるといいね」

詩音の言葉を遮って葛西が補足する。

「つまりは勢子ですね。洩れ目無く追い立てるのが私たちの仕事です」

「うん、……そう。梨花ちゃんを──追い立てる。こんなことをするのは心苦しいんだけど、一刻も早く梨花ちゃんを掴まえるためにはこうするしかないんだ。梨花ちゃんは正気を失っている。たとえ私たちと出会ったとしても、私たちの言葉にも耳を貸さずに逃げ出すと思う」

「────わかりました。お姉」詩音が葛西に目配せをする。「雛見沢の皆さんには、鳴り物の件を『お互いに所在がわかるように音で知らせあう』と説明しましょう。大石さんたちはどうします?」

「連絡して構わないよ。上手く活用して。ただ主導権は取られないように気を付けて」

「了解。お姉」

そういうと、詩音は振り返りもせずに広間を飛び出す。葛西は地図を持ってその後ろを追い掛ける。

「次は沙都子」私は沙都子の方を向くと、詩音がまとめてくれたバッグを沙都子に手渡す。「これで支度をしてから裏山に向かって。あそこは沙都子しか入れないところだから、沙都子にしか頼めないんだ」

沙都子はバッグをチラリと見ると、一瞬だけ怪訝そうな顔をする。しかしすぐ合点した様子で私に応える。

「わかりましたのですわ。すぐに裏山に向かいますのですわ」

「とても危険なことをお願いするけど──」

「大丈夫なのでございますよ。確かに危険なのかもしれませんのですが、……確かにこれは、わたくしでなくてはできないことなのですわ」

「くれぐれも慎重にね。さあ、支度して」

沙都子が広間から飛び出していく。

「魅ぃちゃん。私たちは何をすれば良いのかな、かな?」

レナと圭ちゃんが私を見つめる。私は少し深呼吸をして地図を見る。

まだ調査すべき地域は多く残っている。だが、その全てを確認することはできない。

選択。間違いかもしれない選択。梨花ちゃんを助けることができないかもしれない選択。だが、私は選択しなくてはならない。

「二人にはここに行ってもらいたいんだ」

私は全ての可能性の中から一つ選び出す。

鬼ヶ淵沼。鬼たちの発祥の地。全ての始まりの地。

私は二人に目配せをする。二人は静かに頷く。

「多分、梨花ちゃんはここにいると思う」

直感めいた確信はある。たぶん間違いないだろうという感触もある。

しかし、それでも私はその言葉を信じることができなかった。

(続く)





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)

[C++プログラミング手法]

動的型変数とマルチメソッド

Update: 2009-01-27T02:42:09+09:00

意図

動的型変数と、その変数を引数とするマルチメソッドを提供する。

動機

C++では、静的型のチェックによりコンパイル時にプログラムの整合性を判定できるようになっている。しかし、全ての型がコンパイル時にチェックされるため、徐々に機能を追加していく開発スタイル(スクリプト言語などで良く行われている)だと、この厳しい型チェックのせいで柔軟なプログラミングが困難となっている。

この問題を解決するため、C++ライブラリの一つであるboostでは、動的型変数boost::anyを用意している。しかし、boost::anyはその変数を処理するときに保存してあるデータの型を正確に指定する必要があり、柔軟性が高いとは言えない。

また、Modern C++ Designでは動的に実行するメンバ関数を変更するマルチメソッドの技法について言及しているが、最高速の定数時間のマルチメソッドを実現する手法はクラスそのものに手を加える必要があり、汎用性に劣っていた。

そこで、この二つの技法を組み合せることにより、汎用性が高く、また速度的にも優れた動的変数/マルチメソッドを実装する。

解法とサンプルコード

boost::anyに、型ごとの番号付けの手法を使用してナンバリングを行う機能を付加し、Modern C++ Designで言及されている最高速の定数時間のマルチメソッドを実装する。なお、下記の実装は単純化しているため、詳細はこのページを参照のこと。

なお、Modern C++ Designの対数時間のマルチメソッドならば、boost::anyをそのまま流用してマルチメソッドを実装することが可能である。

// Holder.hpp struct MultiMethod { MultiMethod() {}; public: template<typename R, typename M, typename H, typename A1> static bool entry() { struct Local { static R trampoline(M& self, H& arg1) { // (b) return self(holder_cast<A1>(arg1)); }; }; typedef R (*T)(M&, H&); static bool t((find<T>(Holder::id<A1>()) = &Local::trampoline) != 0); return true; }; template<typename R, typename M, typename H> static R apply(M& method, H& arg1) { typedef R (*T)(M&, H&); T t(find<T>(arg1.id())); if (!t) throw BadMultiMethod(); return t(method, arg1); }; private: //////////////////////////////////////////////////////////////////////// template<typename T> static T& find(const unsigned int pos1) { static std::vector<T> r; // (a) if (r.size() <= pos1) { r.resize(pos1+1, 0); } return r[pos1]; }; }; /////////////////////////////////////////////////////////////////////////// // Original any for fast multi method /////////////////////////////////////////////////////////////////////////// class Holder { public: Holder() : caddy_(0) {}; template<typename type_t> Holder(const type_t& value) : caddy_(new Container<type_t>(value)) {}; Holder(const Holder& other) : caddy_(other.caddy_ ? other.caddy_->clone() : 0) {}; ~Holder() { delete caddy_; }; Holder& swap(Holder& other) { std::swap(caddy_, other.caddy_); return *this; }; template<typename type_t> Holder& operator=(const type_t& other) { Holder(other).swap(*this); return *this; }; Holder& operator=(const Holder& other) { Holder(other).swap(*this); return *this; }; bool empty() const { return !caddy_; }; const std::type_info& type() const { return caddy_ ? caddy_->type() : typeid(void); }; template<typename type_t> type_t* cast() { return caddy_ && type() == typeid(type_t) ? &static_cast<Container<type_t> *>(caddy_)->content_ : 0; }; // additional method unsigned int id() { return caddy_ ? caddy_->id() : 0; }; template<typename type_t> static unsigned int id() { static unsigned int r(count()); return r; }; private: static unsigned int count() { static unsigned int r(0); return ++r; }; // end class Caddy { public: virtual ~Caddy() {}; virtual const std::type_info& type() const = 0; virtual Caddy* clone() const = 0; virtual unsigned int id() = 0; // additional method }; template<typename type_t> class Container : public Caddy { public: Container(const type_t& value) : content_(value) {}; virtual const std::type_info& type() const { return typeid(type_t); }; virtual Container* clone() const { return new Container(content_); }; virtual unsigned int id() { return Holder::id<type_t>(); }; // additional method type_t content_; }; Caddy* caddy_; }; class bad_holder_cast : public std::bad_cast { public: virtual const char * what() const throw() { return "bad_holder_cast: failed conversion using holder_cast"; }; }; template<typename type_t> type_t* holder_cast(Holder* operand) { return operand->cast<type_t>(); }; template<typename type_t> inline const type_t* holder_cast(const Holder * operand) { return holder_cast<type_t>(const_cast<Holder *>(operand)); }; template<typename type_t> type_t holder_cast(Holder& operand) { typedef typename remove_reference<type_t>::type nonref; nonref* result = holder_cast<nonref>(&operand); if(!result) boost::throw_exception(bad_holder_cast()); return *result; }; template<typename type_t> inline type_t holder_cast(const Holder& operand) { return holder_cast<const remove_reference<type_t>::type&>(const_cast<Holder&>(operand)); }; // main.cpp struct TestMethod { std::string operator()(Holder& value) { return MultiMethod::apply<string>(value); }; //(1) std::string operator()(int value) const { return string("int1"); }; //(2) std::string operator()(double value) const { return string("double1"); }; //(3) }; bool m00(MultiMethod::entry<std::string, TestMethod, Holder, int>()); bool m01(MultiMethod::entry<std::string, TestMethod, Holder, double>()); //(4) int main() { TestMethod0 m; Holder h0(0); m(h0); //(5)"int0" Holder h1(0.0); m(h1); //(6)"double0" h1 = 0; m(h1); //(7)"int0" h1 = 'a'; m(h1); //(8)"int0" };

Holderがboost::anyを改造した動的変数クラスで、MultiMethodクラスの静的メンバ関数がマルチメソッド用の関数群である(クラス化してグループ化・アクセス制御を行っている)。使い方は上記の通り。

Holderはboost::anyに型ごとの番号付けを行うメンバ関数idを追加したものである。定数時間のマルチメソッドでは、配列のインデックスアクセスを使用してメソッドへの定数時間アクセスを実現しているが、このマルチメソッドでも同様の技法を使用して定数時間アクセスを実現している。(なお、boost::anyの詳細は説明しない)

MultiMethod::findは、Holderに保存されたインスタンスを実際の型にキャストして実行するトランポリン関数(b)を要素とする配列(a)を、静的ローカル変数として保持する。この配列(a)は、(Holder::idにより型ごとに割り当てられた)整数をインデックスとしている。マルチメソッドは、このトランポリン関数を実行時に呼び出し、引数のHolderを実際の型に変換した上で関数を呼び出すことで実現している。

(なお、上記の配列(a)はコンパイル時に自動的に初期化することができないため、(4)のように登録用のメソッドを使用して初期化を行う)

TestMethodが今回対象となるマルチメソッドで、(2)及び(3)が動的に呼び出されるメソッドである。なお、本例では(1)のように転送関数を用意し、通常の関数オブジェクトと同様にマルチメソッドを呼び出すことができるようにしている。

実際に使用するときは、(5)-(8)のように関数オブジェクトとして使用する。メソッドの呼び出しは

  1. (1)の転送関数でMultiMethod::applyに渡す。
  2. MultiMethod::applyは、
    1. 引数のHolderからHolder::id(実体はContainer::id)を使用して、型ごとに割り当てられた整数を入手
    2. 上記整数をMultiMethod::findに渡して該当するトランポリン関数を入手する。
    3. トランポリン関数内で、Holderを実際の型に変換した上で再度関数オブジェクトを実行する。

の手順で、実行時に引数によるディスパッチを行う。





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)

[C++プログラミング手法]

型ごとの番号付け

Update: 2009-01-12T19:13:24+09:00

意図

動的に、型ごとに番号付けをする。

動機

C++では、動的に型の独自性をチェックする場合はtype_infoクラスを使用する。 type_infoはtypeid 演算子を使用することで取得することができる。type_infoは順序付けされており、比較演算子などで比較することで、同じクラスかどうかを比較することができる。

しかし、type_infoは整数としては扱えないため、配列のインデックスアクセスなどでは使用できない。また、プログラム中で同じ比較しかできないため、指定した順番にしたいなどの要求に応えることはできない。

解法とサンプルコード

小粋なカウンタ(Nifty_Counter)、及びテンプレート関数、静的局所変数を組み合わせて、型からunsigned intへの変換を実現する。

// Numbering.hpp template<typename derived_t> class Numbering { public: template<typename type_t> static unsigned int number() { static unsigned int r(count()); return r; }; private: static unsigned int count() { static unsigned int r(0); return r++; }; }; // main.cpp class A : public Numbering<A> {}; class B : public Numbering<B> {}; int main() { A::number<int>(); //0 ……(1) A::number<int*>(); //1 A::number<int&>(); //2 A::number<const int>(); //3 A::number<const int*>(); //4 A::number<const int&>(); //5 A::number<int>(); //0 ……(2) A::number<int*>(); //1 A::number<int&>(); //2 A::number<const int>(); //3 A::number<const int*>(); //4 A::number<const int&>(); //5 B::number<const int&>(); //0 B::number<const int*>(); //1 B::number<const int>(); //2 B::number<int>(); //3 B::number<int*>(); //4 B::number<int&>(); //5 B::number<const int&>(); //0 B::number<const int*>(); //1 B::number<const int>(); //2 B::number<int>(); //3 B::number<int*>(); //4 B::number<int&>(); //5 };

Numberingテンプレートが指定された型ごとにナンバリングを行うテンプレートである。 ここでは汎用性を高めるため奇妙に再帰したテンプレートとしている。

Numberingは静的テンプレートメンバ関数numberを持つ。numberは型ごとに異なった関数を実体化する。また、numberは関数内に静的局所変数rを持つ。

静的局所変数は、コンパイル時に判別可能な定数を指定されていない場合は、その関数が実行される時に初期化される。すなわち、上記例の(1)のように、各々の型ごとのメンバ関数が初めて実行される時に初期化される。

静的局所変数rは、静的メンバ関数countからの戻り値で初期化される。静的メンバ関数countは呼び出されるごとにインクリメントされた別の整数を返すので、rにはそれぞれの型ごとに別々の整数が割り当てられる。

また、以前に指定された型でnumberが呼び出された場合(2)は、rは既に初期化済のためcountは実行されず、すでに割り当てられたrの値をそのまま返す。

この結果、Numberは型ごとに異なった整数を返すことができる。





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)