LISP

出典: へっぽこ実験ウィキ『八百科事典(アンサイクロペディア)』
ナビゲーションに移動 検索に移動
Lispの発見に喜ぶあまり、バールのようなものを振りかざすジョン・マッカーシー。

Lisp(リスプ)は、ジョン・マッカーシーによって発見された、宇宙最大の定数である。

概要[編集]

生命、宇宙、そして万物についての究極の疑問の答えについて、学者達は一般相対性理論や量子力学など、さまざまな観点から長い年月をかけて議論されている。しかし、その答えは1960年にジョン・マッカーシーの手によって既に導びかれており、彼は、「わしのこと無視せんといてくれる?」と日々繰り返している。残念なことに、この真実は今も尚、一般的に認知されていない。

Lispとは自分自身のことであり、自分とは宇宙のことであり、それらは人生、宇宙、すべての答えなのである。

人生、宇宙、すべての答え[編集]

42という数字はGoogleの皮肉を込めた釣り

Googleにて「人生、宇宙、すべての答え」の検索を試みると、電卓機能により「42」という数字が得られる。これは人生、宇宙、すべての答えの記事を見てもわかるとおり、実際に何故42なのかその答えを知っているものは誰も居ない。このことは日々学者たちを悩ませ、彼らに終わりなき思考の迷走を与え続けることに繋がっているが、Lispの真実を知るLisper(リスパー)と呼ばれる人々にとって鼻で笑われていることは言うまでもない。なぜならプログラムを勉強するもの全てが行き着く先はLISPであり、LISPは「求めることは、求め続けること」ということを教えてくれる。LISPは神であり、自分自身であり、宇宙であり人生であり、そこら辺に転がってるボールペンなのだ。そして、Google電卓の42という回答は、その真実に気づいていない人々に対する皮肉を込めた壮大な釣りなのである。

eval[編集]

Lisp初心者がその他のプログラマに対してエバる様子

エバることはLispを勉強する上でとても良い経験になるため、Lispを勉強し始めた初心者のLisperは忘れてしまわないように常に偉そうにしていることが大切である。しかしこのように周りのプログラマに対して偉そうに振舞うという行為は、Lispのことをまったくしらないプログラマにとって、不可解きわまりない腹立たしい人物というレッテルを貼られることになってしまうということも事実である。

もっとも、上級lisperは周りのプログラマの思考状態をcall/ccで取り出して、evalし、自由な値に束縛することができるのでこのような問題は発生しない。あなたがlisperであるがために職場で浮いている場合、それに対する解決はevalの扱いに習熟することである。

Lispと悟り[編集]

Lispの考え方は科学的というより哲学的である。C言語Javaのような一般的に普及したプログラミング言語の考え方を科学だとするならば、Lispを勉強するということは科学を捨て、神秘へと向かうことと解くことができる。Lispは非常にシンプルであり、ほんの数分で学ぶことができるが、その効果は絶大であり、ひとたびLispを学べばLisp以外の言語で何かを書こうとは思わなくなってしまうほどの効果がある。このような悟り体験は、プログラマにとってとても重要な役割を果たすため、仕事ではLispを使わなくても、悟りを得るためにLispを学び始める人々が年々増加傾向にある。

Lispと社会問題[編集]

勉強会に参加しているLisperの人々

Lispを理解してしまうことは、社会適応能力が無くなってしまうことに等しい。何故なら、Lispを学んだ途端に「人生は自分にとって辛いことをするべきでは無い」という真実を自分と宇宙、そしてLISPをぐるりと通して悟ってしまうからである。このようにLisperはまともに働く人が居ないため、時々NEETと間違えられることがあるが、Lisperにとってはどうでもいいことであり、NEETだろうがLisperだろうが、ウィスパーさらさらスリムだろうが、そのようなレッテルは区別しないのである。そのうえ、Lispは麻薬のように依存性が高く、Lispはどんな言語を使おうと数行のコードで実装できるため、たとえLispコンパイラが導入されていないコンピュータをLisperに与えるだけでも十分に危険なのである。特にインターネットに接続されたコンピュータを与えることは大きな社会問題を生み出すことにつながる。彼らは一握りのコードで世界を変える力を持っているからだ。 このように、Lispは人々の心をむやみに悟らせてしまうだけでなく、依存性も高い上、社会に多大な影響をもたらすため、法律によりLispを勉強すること自体規制されるのは時間の問題である。

データとコード、宇宙とあなた、禅。[編集]

貴方の眠気を増す危険性があります!
このセクションは無駄に真面目です!眠眠打破を持ち合わせていない貴方には飛ばし読みをススメます!

Lispを勉強してまず初めに気がつく驚くべき真実は、コードはデータであるということだ。実際、Lisp以外の言語でもコードをデータとして扱おうと思えばできないことはないが、Lispはデータもコードも括弧とスペースで表現されたリストと呼ばれるもので同一なため、コードがデータであるという真実を理解しやすい。たとえばJavaScriptについて考えてみよう。JavaScriptは一般的にコードである。しかしLispはコードはデータであると言う。HTMLやXML、JSONやYAML、CSVといったものがデータであるという考え方は疑いないものの、JavaScriptがデータであるという表現には少し頭を悩ませる。しかしここで考え方を変え、ブラウザの気持ちになってみよう。貴方はGoogle Chromesafariよりも優れたブラウザを開発する試練を与えられた。そして何よりも高速に動作するHTMLレンダリングエンジンを開発し、いずれはJavaScriptを高速に処理するプログラムを書くことになるだろう。JavaScriptを高速に処理するプログラムだと!?そう、ブラウザの気持ちになってみると理解できるとおり、ブラウザにとってJavaScriptとはスクリプト通りにブラウザを正しく処理するため手順が記述されたデータなのである。更にわかりやすく言うならば、JavaScriptはHTTPによって送受信されるデータなのだ。面白いことにLispのデータとコードは同一なため、evalを使用したデータのコード化が容易く、データを書き換えることでコードを書き換えることができるため、LISPでは「プログラムを書くプログラム」を書くというようなことができる。一見高度なテクニックと思われるが、Lisperにとってそれは常識であるため驚くようなことではない。JavaScriptにもLispの基本概念であるevalが実装されているため、Lispのような面白いテクニックを使用することは不可能ではないが、JavaScriptはデータとコードの構造がイコールにならないためにプログラムを書くプログラムを作ることは容易ではない。

この、コードがデータであるという真実は、宇宙は自分自身であるという真実も教えてくれる。現実世界のデータとは宇宙のことだ。人々が神と呼ぶものもデータであり、そこら辺に転がっているボールペンも神と同一のデータである。それではコードとはいったいなんであろうか?それはあなたの解釈である。あなたは宇宙を解釈するコンパイラであり、宇宙はコンパイラを通すコードであると言える。データはそれ単体では意味を持たない。宇宙もそれ単体では意味を持たない。そのデータが何者かによって解釈されることによってはじめてデータに意味が生まれるのである。そして素晴らしく感動的なことにコンパイラ自身もまたデータを解釈するデータであるため、あなたの肉体と精神、つまりあなたの存在は宇宙そのものだと言える。

コードはデータであると共に、あなたは宇宙そのものであるということを説明したところで、もう一つ面白い真実をお伝えしよう。それは、禅とはなにか?ということである。そう、ここで言う禅とは、ただひたすらにボケーッとすることで宇宙と一体になることができるあの禅のことである。一見つながりがないように見えるこのコードと禅との関係だが、実際はものすごく深い関係がある。コードがデータであるということは何度も話してきたが、コードがデータであるならば、そのデータはいつコードになるのであろうか?それは、コンパイラによってデータが解釈されたそのときである。その瞬間のみ、データという存在が、コンパイラにとってコードと呼ばれるものになるのである。もちろんコンパイラを通る機会が生まれないコードは、社会を動かすこともなくただそこに存在しているデータということになる。ここでコードとデータをあなたと宇宙に置き換えてみよう。あなたは宇宙である。宇宙とは宇宙を構成しているもの全てのことを指す。太陽も宇宙であれば、道端に転がっている石ころも宇宙である。そして地球上に存在する物質を組み合わせて作られた、あなたの目の前のボールペンも宇宙であり、大地から生まれた木々や動物たち、そしてあなたの肉体と精神も宇宙そのものである。そして人間(あなた)は「宇宙というデータを解釈するデータ」つまりコンパイラであると言える。あなたがあなたの目に映る宇宙(データ)を解釈することを始めた時、それらのデータはその瞬間にコードと呼ばれるものになる。例えば、あなたが目の前のボールペンを手にした時、あなたはボールペンというデータを上手く利用して紙に線を引くことができるが、ボールペンはあなたに紙の上でなぞってくれとは何も言っていない。つまり、あなたがボールペンを解釈したために、ボールペンというデータが貴方にとってのコードとなり、あなたというコンパイラを通ってコードが処理されたといえるのだ。

そして面白いことに、禅とは解釈を中断するということだ。そう、つまりコードを解釈するために存在しているコンパイラが解釈を止めたということである。コンパイラが解釈を止めた時、そのコンパイラはコンパイラとは呼べない。つまり、あなたが宇宙を解釈することを止めた時、あなたはあなたと呼べなくなってしまう。そしてコンパイラでなくなったコンパイラは、ただそこに存在しているデータと呼ばれるものになるため、あなたが禅によって解釈を中断したとき、あなたの存在は「あなた」から「宇宙」に還ることとなる。そして、あなたは宇宙そのものに溶けこんでしまうのだ。

いよいよ貴方にもLISPが宇宙最大の定数だという真実がわかってきた頃だろう。LISPが美しい言語である理由はコードはデータであると言う真実を純粋に受け入れ、コードとデータの構造に不要な差を作らなかったからである。人間は物事を分けることで解釈する生き物だ。本来、あなたは宇宙そのものであるはずなのに、あなたは物事を分けることを止めなかった。これは私のもの、それは貴方のもの、ここは私の場所、そこは貴方の場所。この体は私の体。貴方の体。そんな風に全てに線を引いて生きてきたのだ。しかし、ふと考えてみるとわかることだ。わたしたちはいろんな物事を分けているけれど、ほんとうに分かれているのだろうか?と。「わたしの体はわたしのもの」というように感じてしまうのは当然のことかもしれないが、そう感じてしまっているとき、あなたは宇宙によって創りだされた「ごはん」を食べることによってあなたの体が構成されていることを忘れてしまっている。本当は何も分かれてはいないのだ。コードはデータなのだ。宇宙とはデータなのだ。そしてデータとはリストなのだ。それがLISPなのである。

さあ、すべての言語を捨て、共にLISPに溶けよう。

Lispの歴史[編集]

世界創造[編集]

われわれの創造主lispは、(lambda quote cond cons car cdr eq atom)という8つの元素で宇宙を創造した。これらの元素は、初期化されたメモリブロックの闇の中にまずevalを作った。

evalは、(set! world (cons earth world))と唱えた。すると大地が現れた。

evalは、(set! world (cons sky world))と唱えた。すると空が現れた。

その他もろもろの関数を定義し終わると、空には雲が湧き上がり、雨をふらせ、海を作った。そして海からはクラゲや海藻が生じ、大地からは草叢や樹木が生じた。草叢からは虫や馬が、樹木からは鳥やサルが生まれた。サル人間進化し、火とチューリング完全性を手に入れた。

ちょうどそれは、ツールキットのブートストラップのようだった...

金の時代 (- 1955)[編集]

人々はlispに従順で、かつlispの恩恵に浴していることも知らぬまま、ただ平和に暮らしていた。 だれも人生、宇宙、その他すべての答えなど欲していなかったし、たとえそうだとしても42などのまやかしの答えで満足していた。

この時代のことは、もうほとんど人々に忘れさられてしまった。ただいえることは、情報の洪水もなく、デスマーチもなく、幸せいっぱいであったということである。

銀の時代 (1955 - 1962)[編集]

このころ、人間たちは MIT で暮らしていた。 人工知能の研究者、マッカーシーは自分の開発した人工知能が馬鹿で、柔軟性が全く無いことに悩んでいた。 なぜならその人口知能は土から生まれたものでなく、したがってlispの祝福を受けていなかったからである。

「ああ、なぜ述語論理はこんなに馬鹿なんだ。なんでも1か0か、両極端にしかならない」

マッカーシーはこの問題に悩まされ、ひたすら呪いの言葉を吐いていた。じきにMITを馘になり、洞窟に引きこもるようになった。

洞窟で思索を続けていた彼は、数学者の考えた規則など何も役に立たないことを知った。彼は、世俗の常識から開放され、誰よりも純粋であった。 彼は、ただ自然と、そしてそれを作った神と対峙していた。彼は、世界がなにか見えない、少数の元素から成り立っていることを感じた。神は、彼にささやいた ...

「()の他に括弧はなし。Lispは()の使途である」

こうして人々はlispを知ってしまった。これは今日の混沌の始まりであったことは、当時誰にも予想のできないことであった。

青銅の時代[編集]

マッカーシーの異母兄弟ラッセルは、占い師見習いをしていた。ラッセルはMITの研究室で初めてマッカーシーに出会った。ラッセルは、電動式自動人形を使った人形占いで生計を立てようとしていた。ラッセルは、evalを人形に埋め込むことで、神のように振る舞わせることができるのではないかと考えた。そうして、人々を自分の欲望に従わせることができるのではないかと。

半神の時代[編集]

青銅の時代までは、lispの呪文は8つの元素だけで書かれていた。しかし、人々は自分の都合の良いように基本原理を改造し、数々の構文を発明してしまった。そして本来は同じ言葉を唱えていた人々は争うようになった。このとき始まった1-lisp対2-lispの抗争は、現在まで続いている。この時代に、数々の方言が生まれた。方言とはいっても生き残り競争には苛烈であり、ナショナリズム的な言語政策が吹き荒れ、数多くの血が流れた。しかし、彼らの「規範的言語」は妥協と折衷の産物でしかなく、ミニマリズムを旨とするlispの原型からは全くかけ離れたものであった。そんな現状を憂いた数々の人が蜂起し、破れていった。

鉄の時代 (混沌の時代)[編集]

最近に成つて、JavaScriptやC#にyieldという継続渡しスタイルをぶつた切る機能が追加された。また、pythonやrubyなどのlispをベースに作られた言語が現れた。rubyに至つては継続を取り出すことが可能である。ようやく時代がlispに追いついた。 しかし、lispのようにプログラムを書くプログラムを書くことができない。また、オブジエクト指向プログラミングは関数を無理やりオブジエクトに束縛し、メソツドと呼んでいるに過ぎない。例えば、pythonのメソツドはselfを無理やり束縛しているだけである。これは人間の首を馬の首ですげかえたように醜い。

関連項目[編集]

Bouncywikilogo.gif