この記事の内容
LISPは、それをモノにしたときのすばらしい悟り体験のために勉強しましょう。
この体験は、その後の人生でよりよいプログラマーとなる手助けとなるはずです。
たとえ、実際にはLISPそのものをあまり使わなくても。
LISPを知っている人ならば、一度は耳にしたことがあるであろうエリック・レイモンドの格言。この言葉に影響されてLISPに興味を持った人も多いはずだ。
LISPは宇宙最大の定数である。
原子は原子核
と電子
で構成されていて、原子核は陽子
と中性子
で構成されているらしい。
同じようにDNAは二本鎖であり、アデニン
、チミン
、グアニン
、シトシン
の4種類で構成されているようだ。
プログラミング言語には様々な機能や文法があるけれど、余計なものをそぎ落としていったとき、その根っこには何が残るだろう?
ときに最小の言語と言われるLISPは、リストで構成されていて、atom
、eq
、car
、cdr
、cons
という5つの基本関数で成り立っている。
LISPは非常に強力な上、ほんの数分で学べるほど単純だ。ひとたびLISPを学べば、LISP以外の言語で何か書こうと思わなくなってしまうほどである。
それは、LISPが進化するように作られていることを考えれば、何も不思議なことではない。
オブジェクト指向が注目された時、C言語はC++に互換性を持ってアップグレードされた。
しかしLISPの限界は人の思考の限界であったため、オブジェクト指向の概念が生まれた瞬間、LISPではそれがもう可能になっていたのである。
この記事は別途書き留めておいた、僕がLISPを勉強して悟ったタッタ1つの宇宙の真理をわかりやすく修正して転載したものです。
コードはデータ
LISPを勉強して気がつく驚くべき真実は、コードはデータであるということだ。
JavaScriptについて考えてみよう。
JavaScriptは一般的にコードだ。JavaScriptはコードですか?データですか?と質問され「データです」と答える人は珍しいだろう。
XMLやJSON、CSVやYAMLといった形式のファイルがデータであるという表現に違和感は無いが、JavaScriptがデータであるという表現に違和感を感じる人は恐らく正常だ。
しかし、LISPはコードはデータであると言う。
もしもSafari
やChrome
の様な、オリジナルのブラウザを開発することになったら、アナタにとってJavaScriptは、ブラウザを動的に動かすための手順が記述されたデータになるかもしれない。
実際、JavaScriptはコードだが、ブラウザはJavaScriptをデータのように読み込む。
更に言えば、JavaScriptはHTTPプロトコルに従って送受信されるデータであることに違いない。
JavaScriptがデータ...だと!?
コンピュータのメモリやストレージに記憶される全てのものがデータであるならば、コードも本質的にはデータということになる。そしてそのデータは、他のコードによって読み書き可能だ。
コードを読むコードはlintなどのチェックプログラムや、Javadocの様なドキュメントジェネレータが存在するが、LISPのそれは次元が異なる。
LISPは、データもコードも括弧とスペースで表現されたリストと呼ばれる同一シンタックスのため、LISPのコードそのものがLISPが扱うデータとなる。JavaScriptではJSONとJSとでコードとデータが分かれているが、LISPではその様な区別がないのだ。
データとコードのシンタックスが同一というLISPの特性は、Eval
を使用したデータのコード化を容易くし、データを書き換えることでコードを書き換えることを可能とする。
そのため、LISPでは「コードを書くコード」を書くというようなことができる。
一見高度なテクニックに思われるが、LISPerにとってそれはもはや常識であり、驚くようなことではない。
JavaScriptにもLISPの基本となるEval
が実装されているが、JavaScriptはデータとコードのシンタックスが異なるため「コードを書くコード」を書くことは容易でない。
LISPがそれを可能にするのは、コードがデータであるという宇宙の真理を純粋に受け入れたからなのである。
自身は宇宙そのもの
この、コードがデータであるというLISPの真理は、自分自身は宇宙そのものであることも教えてくれる。
仮想世界の全てがデータであるならば、現実世界のデータとは宇宙のことであろう。
宇宙とは「宇宙に存在する全て」を指すので、物質も生物も、人々が神と呼ぶソレも、そこら辺に転がっているボールペンも全てデータということになる。
それでは現実世界のコードとは一体なんであろうか?
それは、アナタの解釈である。アナタは宇宙を解釈するインタプリタであり、宇宙はアナタに解釈されるために存在している。
データがそれ単体では意味を持たないように、宇宙もまたそれ単体では意味を持たない。
データは何者かによって解釈されることによってはじめて意味が生まれるのである。
コードはデータであるという話を繰り返してきたが、もしコードがデータであるならば、はたしてデータはいつコードになるのであろうか?
それは、インタプリタによってデータが解釈されたその瞬間である。その瞬間のみ、データという存在が、インタプリタにとって解釈可能なコードに変わるのである。
ここで、コードとデータをアナタと宇宙に置き換えて考えてみよう。
アナタは宇宙である。宇宙とは宇宙を構成しているもの全てのものを指す。
太陽も宇宙であれば、道端に転がっている石ころも宇宙である。
そして、地球上に存在する物質を組み合わせて作られた、アナタの目の前のボールペンも宇宙であり、大地から生まれた木々や動物たち、そしてアナタの肉体と精神も宇宙そのものである。
そしてアナタは「宇宙を解釈する宇宙」つまりインタプリタと言える。
アナタがアナタの目に映る宇宙の解釈を始めた時、宇宙はアナタにとってのコードとなり、瞬く間にアナタとアナタの行動によって宇宙とに影響を及ぼす。
コンピュータがデータを解析してデータを書き換えるように、アナタは宇宙を解析して宇宙を書き換える。
アナタが目の前のボールペンを手にした時、アナタはそのデータを上手く利用して紙に線を引くことができるが、ボールペンはアナタに紙の上でなぞってくれとはヒトコトも言っていない。
つまり、アナタがボールペンを解釈したため、ボールペンというデータがアナタにとってのコードとなり、アナタというインタプリタを通って処理されたといえるのだ。
そして、素晴らしく感動的なことにインタプリタ自身もまた「データを解釈するデータ」であるため、アナタの肉体と精神、つまりアナタの存在は宇宙そのものだと言える。
宇宙に溶ける
コードはデータであると共に、アナタは宇宙そのものであるということを理解したところで、もう一つ面白い真実をお伝えしよう。
それは、禅とはなにか?ということである。
そう、ここで言う禅とは、ただひたすらにボケーッとすることで宇宙と一体になることができるあの禅のことである。
一見つながりがないように見えるこのコードと禅との関係だが、実際はものすごく深い関係がある。
アナタが宇宙のインタプリタならば、禅とは解釈を中断するということだ。つまり、解釈するために存在しているインタプリタが解釈を止めるということである。
もしインタプリタが解釈することを止めてしまったら、そのインタプリタはインタプリタとは呼べない。つまり、アナタが宇宙を解釈することを止めると、アナタはアナタと呼べなくなってしまう。
動かないインタプリタが、ただそこに存在するだけのデータとなるように、アナタが禅によって宇宙の解釈を中断したとき、アナタはただそこに存在するだけの宇宙となる。
つまり、アナタの存在は「アナタ」から「宇宙」に還ることとなる。そして、アナタは宇宙そのものに溶けこんでしまうのだ。
生きているうちに宇宙に溶け込む体験ができる人は稀だ。
人はマインドの活動を停止することで宇宙と一体になることができるが、「何も考えないこと」を実行するのは、頑張って数秒、慣れてきても数分程度しか続かない。
ちなみに、情報には伝聞情報
体験情報
直接情報
の3種類が存在し、禅によって得られる体験は「直接情報」になる。
伝聞情報:言葉を使って受信できる情報
体験情報:五感を使って受信できる情報
直接情報:自我を超えて情報そのものになる
水槽の脳によって得られる体験は体験情報
になるが、あくまでそれはコンピュータが脳に合わせてゆっくり情報提供してるからである。
もしそれらを解放し、コンピュータが持っている全ての情報に脳が直接アクセスできるようになったらどうであろう。
インタプリタが本質的にデータであるように、自我という名のインタプリタを超え、私たちが宇宙そのものになることは、それを可能にする。
面白いことに、人はマインドの活動をなかなか中断できないため、禅によって宇宙に溶ける体験ができることは巧妙に隠されていると言える。
ぼんがいちにょ
この、コードとデータが同一であるという考え方は、実はコンピュータが生まれる前から存在している。
それは梵我一如という概念である。
これは、個人を支配する原理(アートマン)と宇宙を支配する原理(ブラフマン)が同一であることを意味しており、古代インドにおけるヴェーダの究極の悟りとされるものだ。
いよいよ貴方にもLISPが宇宙最大の定数だという真実がわかってきた頃だろう。
LISPが美しい言語である理由はコードはデータであると言う真理を純粋に受け入れ、コードとデータのシンタックスに不要な差を作らなかったからである。
人は物事を分けることで解釈する生き物だ。
本来、アナタは宇宙そのものであるはずなのに、アナタは物事を分けることを止めなかった。
これは私のもの、それは貴方のもの、ここは私の場所、そこは貴方の場所。この体は私の体。貴方の体。そんな風に全てに線を引いて生きてきたのだ。
しかし、ふと考えてみると解ることだ。
私たちはいろんな物事を分けているけれど、本当に分かれているのだろうか?と。
「わたしの体はわたしのもの」と感じてしまうのは当然のことかもしれないが、そのように感じてしまっているとき、アナタは宇宙によって創りだされた「ごはん」を食べることによってアナタの体が構成されていることを忘れてしまっている。
本当は何も分かれてはいないのだ。コードはデータなのだ。宇宙とはデータなのだ。そしてコードとデータはリストなのだ。それがLISPなのである。
さあ、すべての言語を捨て、共にLISPに溶けよう。
まとめ
ぶっちゃけ、こんな記事を書いたところで何にもならない。
むしろ「この人大丈夫なの?」といった具合に、今までの記事の信憑生を疑われるだけであろう。
完全にネタであるが、個人的にネタとも言い切れない部分が多々ある。
プログラミングを学習することはある意味で、人生・世界、事物の根源のあり方・原理を追求することを要求される。
これってある意味、悟りを開くために哲学することと同じに思えてならないんだ。
つまり「宇宙の仕組みを知ろうよ!幸せになれるぜ!」ってこと。実際、わからないから苦しむのであり、理解が深ければコンピュータと睨めっこする時間も減る。
そして宇宙の仕組みをより深く知ったものがエレガントな問題解決を行い、人はそれをハッカーと呼ぶのだ。
ティモシー・リアリーが「コンピュータを使って自分の脳を再プログラミングすることができる」と主張したように、僕もまたコンピュータを通して成長させられた。
悟りとか真理だとかそういった言葉を使うと胡散臭くなるが、宇宙との付き合い方が分かれば分かるほど、宇宙とうまくやっていけるってだけの話である。