Loading...

LISP が他と違う点

Original

2001 年 12 月 (2002 年 5 月改訂)

(この記事は、 LL1メーリング リストでのいくつかの質問に応えて作成されました。現在はRevenge of the Nerdsに組み込まれています。)

マッカーシーが 1950 年代後半に Lisp を設計したとき、それは既存の言語、その中で最も重要な言語であるFortranからの根本的な逸脱でした。

Lisp は 9 つの新しいアイデアを具体化しました。

**1. 条件文。**条件文は if-then-else 構造です。今では当たり前のことですが、これは McCarthy が Lisp の開発中に発明したものです。(当時の Fortran には、基盤となるハードウェアの分岐命令に基づいた条件付き goto しかありませんでした。) Algol 委員会に所属していた McCarthy は、条件文を Algol に取り入れ、そこから他のほとんどの言語に広まりました。

2. 関数型。Lispでは、関数はファーストクラス オブジェクトです。つまり、整数や文字列などと同じデータ型であり、リテラル表現を持ち、変数に格納したり、引数として渡したりすることができます。

**3. 再帰。**もちろん、再帰は Lisp より前から数学的な概念として存在していましたが、Lisp はそれをサポートした最初のプログラミング言語でした。(関数をファーストクラス オブジェクトにすることには、おそらくそれが暗黙的に含まれています。)

4. 変数の新しい概念。Lispでは、すべての変数は実質的にポインタです。型を持つのは値であり、変数ではありません。変数を割り当てたりバインドしたりするということは、ポインタが指すものではなく、ポインタをコピーすることを意味します。

5. ガベージコレクション。

6. 式で構成されるプログラム。Lispプログラムは式のツリーであり、各式は値を返します。(一部の Lisp 式では、複数の値を返すことができます。) これは、式と文を区別する Fortran やその後継言語のほとんどとは対照的です。

Fortran ではこの区別が当然でした。なぜなら、(入力形式がパンチ カードである言語では当然ですが) 言語は行指向だったからです。ステートメントをネストすることはできませんでした。そのため、数学が機能するには式が必要でしたが、値を待つものが何もなかったので、他の何かに値を返すようにしても意味がありませんでした。

この制限はブロック構造の言語の登場とともになくなりましたが、その時はもう遅すぎました。式と文の区別は定着し、Fortran から Algol に、そしてその両方の子孫に広まりました。

言語が式だけで構成されている場合、好きなように式を構成できます。( Arc構文を使用して)

(foo (= x 1) (= x 2) の場合)

または

(= x (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 を説明するのは奇妙です。おそらく、McCarthy はそうは考えていなかったでしょう。Lisp は Fortran の誤りを修正するために設計されたのではなく、むしろ計算を公理化する試みの副産物として生まれました。