寿司 ─ 閉塞編
この記事は寿司 Advent Calender 15日目の記事です
はじまりはじまり
これは、日本の何処かにある、何の変哲もない寿司屋の話です。当然、この寿司屋は、レーンに載ってくるくると廻るような寿司ではなく、板前と親方が丁寧に握る寿司屋であることは間違い無いです。
さて、この寿司屋、ただ一つだけ変わったところがありました。今回は二人の話を立ち聞きしてみることにしましょう。
開店
親方「よお、マサ、この寿司、何かに似ていると思わないかね」
マサ「はあ、何かに似ている……といいますと?」
親方「お前さんは、プログラミングっつーものをしたことがあるかね」
マサ「ああ……多少は……とはいえ、PHPで簡単な掲示板を作った程度ですけど」
親方「そうか、実は世の中にはClojureというプログラミング言語があるのを知っているか」
マサ「はあ……Clojureですか、聞いたことないですね」
親方「Clojureっつーのは、Lispというプログラミング言語を元にしている。LispというのはList Processerという言葉の略だ」
マサ「それが寿司とどう関係あるんですかね?」
親方「これが大有りなんだな。寿司というのは、普通、どういうものだと思うかね」
マサ「はあ……寿司というと普通……
[ ネタ ] (しゃり)
こういうものですよね?」
親方「おう、それをちょっと横に寝かしてみろ」
マサ「横に寝かすと……
[ネタ] (しゃり)
ですかね?」
親方「その通りだ。実はこの構造、Lispの表現方法とそっくりだな。これをLisp式に直すと
(ネタ しゃり)
となるわけだ」
マサ「はあ……」
親方「この括弧で並べられた、一つの項目のことを利すととよぶ。高度に訓練されたLisperというのは、万物にリスト的構造を見つけ出すものじゃ。寿司もリストの一つであり、全体として寿司を生成しているわけだが、寿司の中身をみれば、ネタとシャリという二つの要素である。さらにシャリの中を見てみれば、米粒同士が群をなしている。これもまたリストの要素であり……」
マサ「あー、この店にお客が来ない理由がわかってきたぞ」
親方「まず、ネタとしゃりの組み合わせ、これを『寿司』として定義しよう。Clojureで『寿司』を定義してみよう。
(defn 寿司 [ネタ しゃり] [ネタ 'しゃり])
これで、(寿司 :マグロ)
と言われれば、しゃりの上に乗った寿司が運ばれてくるという寸法だ」
マサ「とはいえ、普通お客さんは『寿司のマグロ』とはいいませんよね。だって寿司屋にいることは寿司が出てくるのは当然で、『マグロ!』とか言うわけじゃないですか」
親方「その通りだ。しかし我々にとって『マグロ』とは『寿司のマグロ』に他ならない。つまり、この二つを橋渡ししないといけないわけだ。だからマグロの寿司を定義すればいい。
(defn マグロ [] (寿司 :マグロ))
というわけだ」
マサ「でも、いちいち定義するんですか?面倒くさいなあ。例えば、赤貝とかイカとか、玉子とか、いろいろあるわけですよ。それをいちいち
(defn 玉子 [] (寿司 :玉子)) (defn 赤貝 [] (寿司 :赤貝))
なんて書き連ねるんですか?」
親方「得てしてメニューというのはそういうもんだが、しかし言いたいことはわからんでもない。要するに目録をつくって、そこから寿司の定義が出来ればいいわけだ」
マサ「ええ、そういうことです」
親方「実は、そういう風に定義をした看板があるんじゃ。しかし客はLispが面倒くさい、気持ち悪い、JavaScriptのほうが親しみが持てる、Lispはエリート向けの言語だ、気取りやがってと散々じゃったから締まったものなんだが、
(defmacro 目録 [ネタ] `(defn ~ネタ [] (寿司 (keyword (quote ~ネタ)))))
というのを用意していたんじゃ」
マサ「えーと、マグロですかね」
親方「違う、これはマグロではなく、マクロじゃ。こういうのを定義することにより
(目録 玉子) (目録 赤貝) (目録 イカ) (イカ) (赤貝)
と看板をぶら下げることにより、簡単に客のイカ
とかマクロ
……じゃない、マグロ
という声に応えられるようにするわけだ」
マサ「なんだか釈然としないですね。まあこのイカ
というのはわかるんですが、:イカ
とか、こいつはなんなんです?」
親方「ふっふっふ、こいつがあることによって、値段が上手く取り出せるんじゃ。例えば、ここに値段表がある
(def 値段表 {:玉子 100 :イカ 120 :赤貝 120})
こいつから値段を取り出してくるものを作れる。
(defn 値段 [ネタ] (値段表 (first (ネタ))))
どうじゃ、便利だろう」
マサ「うちの店、時価じゃなかったでしたっけ?」
親方「ならば簡単で、単にatom
を使えばよい
(def 値段表 (atom {:玉子 100 :イカ 120 :赤貝 120})) (defn 値段 [ネタ] ((deref 値段表) (first (ネタ)))) (swap! 値段表 assoc :イカ 200) (値段 イカ)
これで、値段表のイカの部分が更新される」
マサ「ふーん、なかなか便利ですね。しかしさっきから気になっていたんですけど、この'しゃり
というのは何ですか」
親方「まあ、おぬしは知らなくてもよい」
マサ「ふーん、じゃあeval
してみますね」
親方「おい、お前もClojureが……というかやめなさい!」
(eval 'しゃり) "タイ米"
マサ「あっ、このしゃり、タイ米じゃないか!これじゃあ来ない筈だ!つーか新潟高級コシヒカリを買うお金は何処にやったんだ」
親方「まあ、細かいことは……」
マサ「まさか……酒代に全部使ったとかでは……」
親方「おっとー用事を思い出したから、あとはまかせたぞー」
マサ「あっ、こらっ、まてっ!」
つーわけで、愉快なClojure寿司、貴方もどうですか。
読者「あの、似非原さん」
似非原「はい、なんでしょう」
読者「これって、この本のパクりでは……」
![初めての人のためのLISP[増補改訂版] 初めての人のためのLISP[増補改訂版]](http://ecx.images-amazon.com/images/I/514rdLjpERL._SL160_.jpg)
- 作者: 竹内郁雄
- 出版社/メーカー: 翔泳社
- 発売日: 2010/03/10
- メディア: 単行本
- 購入: 31人 クリック: 565回
- この商品を含むブログ (48件) を見る
似非原「……」