Lisp を特別なものにしたもの

«史上最高のプログラミング言語«
— アラン・ケイ、「on Lisp」

Lisp を特別なものにしたもの

マッカーシーが 1950 年代後半に Lisp を開発したとき、それは既存の言語とは根本的に異なっていました。その中で最も重要なものは、 Fortran.

Lisp は XNUMX つの新しいアイデアを導入しました。

1. 条件文。 条件文は if-then-else 構造です。 今、私たちはそれらを当然のこととして受け入れています。 彼らはいた 発明した Lisp の開発中のマッカーシー。 (当時の Fortran には、基盤となるハードウェアの分岐命令と密接に結合された goto ステートメントしかありませんでした。) マッカーシーは、Algol 委員会に所属していたときに、条件文を Algol に提供し、そこから条件文が他の言語に広がりました。

2. 関数の種類。 Lisp では、関数は第一級のオブジェクトです。関数は数値や文字列などと同様にデータ型であり、リテラル表現を持ち、変数に格納したり、引数として渡すこともできます。

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

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

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

6. 式で構成されるプログラム。 Lisp プログラムは式のツリーであり、それぞれが値を返します。 (一部の Lisp 式は複数の値を返すことができます。)これは、「式」と「ステートメント」を区別する Fortran や他の多くの成功した言語とは対照的です。

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

ブロック構造言語の出現により制限は解除されましたが、その時には手遅れでした。 式とステートメントの区別はすでに確立されています。 それは Fortran から Algol へ、そしてさらにその子孫へと受け継がれました。

言語が式だけで構成されている場合は、好きなように式を作成できます。 どちらでも書くことができます(構文を使用して) アーク)

(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 とともに) Lisp でマクロを可能にする項目 9 は、まだ Lisp にのみ存在します。おそらく、(a) それらの括弧または同様に悪いものが必要であり、(b) この最新の機能強化を追加すると、次のことが可能になります。彼らはもはや新しい言語を発明したとは主張しておらず、Lisp の新しい方言を開発したとだけ主張しています。 -)

これは現代のプログラマにとっては便利ですが、他の言語で採用されているランダム手法との違いという観点から Lisp を説明するのは奇妙です。 これはマッカーシーが考えていたことではないかもしれない。 Lisp は Fortran のエラーを修正するように設計されていません。 それはむしろ試みの副産物として現れた 計算を公理化する.

出所: habr.com

コメントを追加します