読者です 読者をやめる 読者になる 読者になる

Line 1: Error: Invalid Blog('by Esehara' )

または私は如何にして心配するのを止めてバグを愛するようになったか

>> Zanmemo

あと何かあれは 「esehara あっと じーめーる」 か @esehara まで

寿司 ─ 閉塞編

この記事は寿司 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[増補改訂版]

似非原「……」

宣伝