Lispのシンボル、Schemeのシンボル。それぞれの違いがもたらすマクロの実装
だいぶ前、7,8年くらい前ですかね。
CommonLisperである黒田さんのこの記事を読んで、
当時Schemerだった僕は完全にCommonLispへと宗旨替えしました。*1
端的に言えば前述記事の通り、たしかにCommonLispのシンボルはファーストクラスで、
Schemeにおけるシンボルはファーストクラスではない。
そう思っていました。*2
しかしTwitter上での僕のなんてことのないつぶやきに@を飛ばしてくれた方がいました。
- @anohana: @sandmarkM 「シンボルがファーストクラスではない」は見解の違いで、Schemeではシンボルと識別子を意味的に分けて考えます。(後略)
- 上記ツイートに埋め込まれたURL: http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%E3%83%9E%E3%82%AF%E3%83%AD%3aCommonLisp%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83
参照先はScheme処理系Gaucheの開発をなさっているShiroさんによる、
上記黒田さんの記事への言及です。
長いことS式を見ていなかったので読むのに少し苦労しましたが、
つまるところ @anohana さんのおっしゃる通り「見解の違い」という表現がしっくり来ます。
すなわち「シンボルがどうのこうの」というLisp - Scheme間の問題はマクロから来ているわけで。
CommonLispもそうでないとは言い切れませんが、
Schemeは概して学術的かつ専門的で、皮肉って『黒板言語』なんて言われたりもしています。*3
Schemeにおけるマクロorシンボルの定義はすでに何十年も議論されていて、
それだけ活発であると同時に、マイナーであり、素人の入り込む余地は限りなく少ない。
事実、僕の頭では回転率を120%、あるいはそれ以上に引き上げなければ
前述の記事の内容を理解することはできません。
一人のコーダーとして未熟だということももちろんありますが、
Ruby作者であるmatz氏(http://yugui.jp/articles/465)によれば
Rubyは「普通の人」むけ言語だ。ALGOL系の文法だし「普通のプログラマ」にわかりやすい。
対して、Lispなんかはやっぱり頭の良い人向け言語だ。(最近のRails勉強会@東京まわりでは青木さんの「ふつう」シリーズに因んでこの種の頭のいい人を「ふつうの人」と呼ぶ)
最近はHaskellブームだったりして関数型言語の台頭というか復権というかが目覚しいけれども、「あと10年ぐらいするとこの潮流の中からHaskellのアイディアを継承した『普通の言語』が出てくるかもしれない」とMatzは言う。
とのことです。
Lisp狂信者である僕としては「全てはLispから始まりLispに還る」と思っているわけなんですが、
matz氏はそもそもマクロ懐疑論者なので、
Ruby(MRI)にマクロが導入されることはおそらく無いでしょう。*4
普段Rubyを使っている身としては『マクロ』についての理解がおろそかになっていたことは否めません。
しかし今回の指摘で、少しではありますが理解が深まったと思いたいです。
これをTwitterに埋もれさせておくにはあまりにももったいないと思ってエントリにしました。