タオルケットをもう一度2

「タオルケットをもう一度2」というゲームを他人から強く勧められた。なんで2なのかわからんが買うのは嫌だし借りると感想聞かれてうざったいのでやらない、と答えたらフリーソフトらしい。とりあえずググってダウンロードしたが、RPGツクール2000とやらのランタイムが必要らしい。古いものらしく、これをインストールすることで他のものが動かなくなるのが嫌なのでやめておいた。が、どんなゲームなのか知りたかったので、ストーリーを検索してみた。


こんなんだよ。だまされたよ。


もしかして嫌がらせで勧められたかと思ったのだが、けっこう人気のある作品らしい。夢にでてきそうな嫌なストーリーだ。やらなくてよかった。


最近映画にしても物語にしても、昔あれほど嫌っていたハッピーエンドなモノが好きになった。落語を好きなのも、不幸な話が少ないからだと思う。「帯久」とか嫌いだけど、それでも最後は悪い終わりかたではない。あれほど好きだった「カムイ伝」のようなものも読みたくない。今は「まんが道」のように悪者が一人もでてこないような漫画が好きだ。フェリーニの「道」よりも、ほとんどストーリーがあってないようなものである能天気でたわけたハリウッド映画が良い。映画・漫画もそうだが、読書も同じことだ。


漫画や映画同様、本も読めない・読みたくないジャンルが増えてくる。 読めない・読みたくない ジャンルのものの中でで読めるものは「昔読んだことがある本」に限られてくる。例えばカフカの「変身」のような話でもあらすじだけ読むと多分今の僕には読みたくない本だと思う。それでも再読可能なのは、昔読んだことがあるからだ。逆に「8月の光」のような本は、昔読んだことがないのであらすじだけで読む気が起きなくなる。だって、新潮版の裏表紙のあらすじに主人公の黒人が差別の末に惨殺されるとか書いてあるし。まぁ、文学は悩みとか苦痛とか絶望とかが書かれていることが多いので、読んだ事がないものを新規開拓するのは難しいと思う。


ゲームにしたって同様なのだろうなぁ。表題のゲームをやるには老いすぎたと思う。勧めてくれた人にこういった話をして、「落語を聞きながら将棋を指し、縁側で茶をすすっているような男にでも出来るゲームをお勧めしてくれ」と言っておいた。ソリティアでもやってろ、と即答されたが。

アナフォリックマクロ

昔居た会社にシンボリック社日本法人の元社員が数人居た。当然というか何と言うか彼らはLisperであり、それについて熱く語る人たちだった。そういった会社に居たにもかかわらず、結局Lispがどれほどすごい言語なのかさっぱりわからなかった。


Lispの真価を知ったのは、そのマクロ機能を解説した以下の本を読んでからだ。


On Lisp
クチコミを見る





どんな言語でも良いのだが、ある関数(hogeCalcとする)の結果を元に分岐をしたいとする。多分ほとんどのプログラマは次のように書くことだろう。


-----------------------------------------------------------

if (hogeCalc() == XXX) {

     処理

}

-----------------------------------------------------------

コード1


で、ここでhogeCalcで計算した結果を他の部分でも使わなければならないという事態が発生したとする。そうするともうこの構文は使用できない。if文の中を変更するのが嫌ならばhogeCalcをもう一度呼ぶしかない。スマートでないけど、忙しいとこんなことをしてしまう人も居ることだろう(僕だ)

------------------------------------------------------------

if (hogeCalc() == XXX) {

     処理

}

//後で追加した処理

result = hogeCalc() + 100

------------------------------------------------------------

コード1-2



追加処理が一つだけなんで問題ないが、さらに追加した場合はこうなる


------------------------------------------------------------

if (hogeCalc() == XXX) {

     処理

}

//後で追加した処理

result = hogeCalc() + 100

result2 = hogeClac() - 100


------------------------------------------------------------

コード1-3



こうなるとソースコードを見られた場合に結構恥ずかしい。気にしない人もいるが(当然僕だ)

hogeCalcが軽い処理の場合は3回呼び出そうが1回呼び出そうが関係なくソースコードが汚いだけで済むのだが、hogeCalcがデータベースに接続したりする場合は、処理の時間が秒単位で変わる。悪態をつきながらも、以下のように書き直さざるを得ない。


------------------------------------------------------------

hoge = hogeCalc()


if (hoge == XXX) {

     処理

}

//後で追加した処理

result = hoge + 100

result2 = hoge - 100


------------------------------------------------------------

コード1-4


これは現行の手続き型言語ではどうしようもない。それはIF文がそういったものだからだ。では、”IF文の条件で実行された値を保持する”というIF文を作ってしまえば良いではないか、これがLispの発想だ。


新たにaif(アナフォリックIF)という特殊なIF文を作成する。これはIFの条件部分で実行された結果が特定の変数に代入されるというものだ。この場合"it"と変数に結果が入る。



では、コード1に戻ろう

-----------------------------------------------------------

aif (hogeCalc() == XXX) {

     処理

}

-----------------------------------------------------------

コード1


そしてコード1-3は以下のようになる

------------------------------------------------------------

aif (hogeCalc() == XXX) {

     処理

}

//後で追加した処理

result = it + 100

result2 = it - 100


------------------------------------------------------------

コード1-3


説明しやすいようにC言語(Java C# でも同じ)のように書いているが、残念ながらこれら現在主流となっている言語ではこのようなことは出来ない。主にLisp等の関数型言語(Perlでも出来そうだけど、未確認)以外では実現困難だ。


別にif文だけでなく、特殊なループ文を自分で作成することが出来る。例えばLispにはCで言うところのfor文がないので、自前でfor文を用意することになる。つまり、言語自体はいかようにも拡張可能な言語ということだ。


これ読んでLispはじめる人が居たら良いなぁ。いないと思うけど。





-----------------------------------------------------------
最新コメント
QRコード
QRコード
  • ライブドアブログ