LISP を特別なものにしたもの
OriginalDecember 2001 (rev. May 2002)
(この記事は、LL1 メーリングリストでのいくつかの質問への回答として生まれました。現在は Revenge of the Nerds に組み込まれています。)
マッカーシーが 1950 年代後半に Lisp を設計したとき、それは既存の言語、特に Fortran から根本的に異なるものでした。
Lisp は 9 つの新しいアイデアを体現していました。
1. 条件文。 条件文は if-then-else 構文です。今では当たり前のものですが、マッカーシーが Lisp を開発する過程で 発明 されたものです。(当時の Fortran は、基底となるハードウェアの分岐命令を基にした条件付き goto しかありませんでした。) Algol 委員会に所属していたマッカーシーは、条件文を Algol に導入し、そこから他のほとんどの言語に広まりました。
2. 関数型。 Lisp では、関数は第一級オブジェクトです。つまり、整数、文字列などと同じデータ型であり、リテラル表現を持ち、変数に格納でき、引数として渡すことができます。
3. 再帰。 再帰は、もちろん Lisp より前に数学的概念として存在していましたが、Lisp はそれをサポートした最初のプログラミング言語でした。(関数を第一級オブジェクトにすることは、議論の余地なく暗黙的に再帰をサポートしています。)
4. 変数の新しい概念。 Lisp では、すべての変数は事実上ポインタです。値には型がありますが、変数には型はありません。変数を代入またはバインドすることは、ポインタをコピーすることを意味し、ポインタが指すものをコピーすることを意味しません。
5. ガベージコレクション。
6. 式で構成されるプログラム。 Lisp プログラムは、式のツリーで構成され、各式は値を返します。(一部の Lisp では、式は複数の値を返すことができます。) これは、Fortran やその後のほとんどの言語とは対照的です。Fortran やその後のほとんどの言語では、式と文を区別しています。
Fortran でこの区別があったのは、(驚くことではありませんが、入力形式がパンチカードだったため) 言語がライン指向だったからです。文をネストすることはできませんでした。そのため、数学を扱うために式が必要でしたが、他のものを値を返すようにすることは意味がありませんでした。なぜなら、それを待つものがないからです。
この制限は、ブロック構造化言語の登場によって解消されましたが、その頃には手遅れでした。式と文の区別は、Fortran から Algol に、そしてその子孫の両方に広まりました。
言語が完全に式で構成されている場合、式を自由に組み合わせることができます。(Arc の構文を使用すると)
(if foo (= x 1) (= x 2))
または
(= x (if foo 1 2))
と書くことができます。
7. シンボル型。 シンボルは、文字列とは異なり、ポインタを比較することで等価性をテストできます。
8. シンボルのツリーを使用したコードの表記。
9. 言語全体が常に利用可能。 読み込み時、コンパイル時、実行時の区別はありません。読み込み時にコードをコンパイルまたは実行したり、コンパイル時にコードを読み込んだり実行したり、実行時にコードを読み込んだりコンパイルしたりできます。
読み込み時にコードを実行すると、ユーザーは Lisp の構文を再プログラミングできます。コンパイル時にコードを実行すると、マクロの基礎となります。実行時にコンパイルすると、Emacs などのプログラムで Lisp を拡張言語として使用できるようになります。実行時に読み込むと、プログラムは s 式を使用して通信できます。これは、最近 XML として再発明されたアイデアです。
Lisp が最初に発明されたとき、これらのアイデアはすべて、1950 年代後半に利用可能なハードウェアによって大きく左右されていた通常のプログラミング慣行からかけ離れていました。
時が経つにつれて、一連の人気言語に体現されたデフォルト言語は、徐々に Lisp に近づいてきました。1-5 は現在広く普及しています。6 は主流に登場し始めています。Python は 7 の一種を持っていますが、それに対する構文は存在しないようです。8 は (9 とともに) Lisp マクロを可能にするものであり、これまで Lisp に固有のものでした。これは、(a) かっこが必要であるか、またはそれに匹敵するものが存在するため、(b) その最後の力を加えると、新しい言語を発明したと主張することはできず、Lisp の新しい方言を設計しただけであるためです ; -)
現代のプログラマーにとって有用ですが、Lisp を他の言語が採用したランダムな手段からの変異という観点から説明するのは奇妙です。おそらく、マッカーシーはそう考えていませんでした。Lisp は、Fortran の間違いを修正するために設計されたものではありませんでした。それは、計算を公理化する 試みの副産物として生まれたものです。