Skip to content

Instantly share code, notes, and snippets.

@kuniyoshi
Created February 7, 2020 15:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kuniyoshi/bdac74cf0a93216a0767a2464ea1700c to your computer and use it in GitHub Desktop.
Save kuniyoshi/bdac74cf0a93216a0767a2464ea1700c to your computer and use it in GitHub Desktop.
ハッカーと画家、メモです。
Lisp のユニークさ
最初に開発された時、Lisp は 9 つの新しいアイディアを内包していた。そのうちのいくつかは現代では当然のことになっている。残りのうちいくつかは進んだ言語に見られ、2 つはまだ Lisp 特有だ。主流の言語に取り込まれた順にこの 9 つのアイディアを並べるとこうなる。
1. 条件式。if-then-else という構造だ。今ではあって当然のものだが、Fortran I にはなかった。Fortran I が持っていたのは機械語の命令を反映した、条件付き goto であった。
2. 関数型。Lisp では関数は整数や文字列と同じようなデータ型の一つだ。リテラル表記を持ち、変数に代入できて、引数として渡したり、いろいろなことができる。
3. 再帰。Lisp は再帰をサポートした最初の高級言語だった。
4. 動的型付け。Lisp では全ての変数は実質的にポインタだ。変数ではなく値のほうに型がついており、代入や束縛は実質的にポインタのコピーで行われ、ポインタが指しているものには作用しない。
5. ガベージコレクション。
6. 式でプログラムが構成されること。Lisp プログラムは式の木であり、それぞれの式が値を返す。これは Fortran とそれを引き継ぐ多くの言語とは対照的だ。それらの言語は式と文を区別している。Fortran I において式と文を区別することは自然だった。文はネストできなかったからだ。数式が使えるようにするのに式は必要だったが、それ以外の処理が値を返す必要もなかった。文の戻り値を受けるものなんてなかったからだ。この制御はブロック構造化言語の到来によって無くなるはずだったが、その時にはすでに手遅れだったのだ。式と文の区別は慣行の中に根を下ろしてしまっていた。それは Fortran から Algol に広がり、その子孫の言語へと受け継がれていった。
7. シンボル型。シンボルは実質的にはハッシュテーブルに格納された文字列へのポインタである。これによって、文字を一つひとつ比較しないでもポインタの比較だけで済む。
8. シンボルと定数の木によってコードを実現すること。
9. 言語のすべてが常にあること。読み込み時、コンパイル時、実行時が明確に分離したステップになっていない。読み込み時にコンパイルしてコードを走らせることもできるし、コンパイル時にコードを読んだり走らせたりすることもできるし、実行時にコードを読んだりコンパイルしたりすることができる。読み込み時にコードを走らせることにより、ユーザが Lisp の構文を変更することができる。コンパイル時にコードを走らせるというのはマクロの基本だ。実行時にコンパイルするというのは Lisp を Emacs のようなプログラムの拡張言語として使うことを容易にする。そして、実行時に読み込みができるというのは、プログラム同士が S 式を使って通信できるということだ。最後のアイディアは最近 XML として再発明された。
...
言語を自分自身のデータ構造で表現するということは、非常に強力な機能となった。アイディア 8 と 9 を合わせると、プログラムを書くプログラムを書けるということになる。これは突飛なアイディアに聞こえるかもしれないが、Lisp プログラマが日常的に行っていることだ。
このアイディアは通常、マクロと呼ばれる方法で実現される。
Lisp における「マクロ」という用語は他の言語におけるそれとちょっと違う。Lsip のマクロは、単なる省略形から新しい言語のコンパイラまで何にでも成り得る。もし Lisp を本当に理解したいか、プログラミングの認識の地平線を広げたいなら、マクロについて学ぶことをお勧めする。
(Lisp の意味での) マクロは、私の知る限り依然として Lisp に特有のものだ。多分、マクロを持つためには言語を Lisp と同じような奇妙な外見にしないとダメだからだろう。それにまた、マクロという最後の力を加えたら、それは新しい言語ではなく Lisp の新しい方言になってしまうからだろう。
私はよくジョークでそういうことを言うのだが、実際それは真実なんだ。car、cdr、cons、quote、cond、atom、eq、そして関数をリストで表現する方法を備えた言語があれば、あなたは Lisp の残り全てをそれで構築することができる。これが Lisp の本質を定義しているんだ。マッカーシーが Lisp にこの姿を与えたのは、まさにそのためだったからだ。
ハッカーと画家, pp-190-192, 第 1 版第 15 刷
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment