LISPには、他のプログラミング言語では採用されていない特別な機能がまだありますか?
LISPとは、全体としてすべてのLISPプログラミング言語を意味します。私はLISPの素晴らしさを聞いており、多くの言語がLISPに触発されていることを知っています。しかし、LISPには他の言語では実行できない独占的な設計機能がまだありますか?
私が質問した理由は、最近、私自身アマチュアプログラマーとして、楽しみのためだけに Clojure を学び始めた結果です。その結果、LISP関連の投稿やコメントがたくさん見つかり、 「LISPはユニーク」ですが、他の最新のプログラミング言語は、条件付き、再帰、一流の市民としての関数など、LISPから多くのアイデアをすでに採用し、盗んでいます。そして メタプログラミング でさえ、多くの言語で実行できます。
私は何かを逃したのですか、それでも「LISPはまだ異なります」ですか?
あるいは、他の現代の言語がLISPからすべての優れた部分を盗んできたため、 かっこLISPの世界 に掘り下げる必要がなく、「LISPは異なっていた」ので、私は幸運です。
このタイプの質問の標準的なリファレンスは、Paul Grahamの LISPの違い です。この記事の執筆時点でのこの記事によると、広く利用できないLISPの残りの2つの主要な機能は次のとおりです。
8。シンボルのツリーを使用したコードの表記。
9。言語全体が常に利用可能です。読み取り時、コンパイル時、および実行時に実際の違いはありません。読み取り中にコードをコンパイルまたは実行し、コンパイル中にコードを読み取りまたは実行し、実行時にコードを読み取りまたはコンパイルできます。
解説では各ポイントを取り上げ、その機能が利用できる人気のある言語を挙げています。
8(9を含む)はLISPマクロを可能にするものであり、これまでのところLISPに固有のものです。これは、おそらく(a)括弧が必要であるか、それと同じくらい悪いので、(b)その最終的な電力の増分を追加した場合、あなたはもはや新しい言語を発明したと主張することはできず、LISPの新しい方言を設計したと主張するだけです。 -)
この記事は2002年に最後に改訂され、過去11年間に多種多様な新しい言語があり、その一部はこれらのLISP機能をすべて設計に組み込んでいる可能性があることに注意してください。
他の人がLISPで利用できる特定の機能を備えていないことを知るためにすべての言語を知る必要があるため、質問は答えるのが難しいものです。したがって、以下は私が経験した言語に基づいています。
私の頭の上の conditions は、他の言語では見たことのないものです。 「例外」を考えてください。ただし、コールスタックがほどかれておらず、呼び出し元がリカバリー値を例外サイトに送信できる場所ですが、なしでハンドラーと例外のソースの間のスタックを呼び出します。公平に言うと、これは実際には継続の特別なアプリケーションにすぎないので、RubyおよびScheme(少なくとも)canこれを行う。
LISPのマクロシステムは規則性/ホモニコ性から恩恵を受けますが、 Scalaはそれらを2.12の安定した機能として組み込む予定です および Template Haskell は同様の機能を主張しています。これらはLISPよりも構文的に複雑になると思いますが、コードのコンパイル時の生成は関係ありません。
考えてみてください。ただし、フォームを直接作成することは、LISPで使用できるマクロの1種類にすぎません。他の場所では、同等のコンパイラマクロやリーダーマクロは見たことがありません。
一部の方言(例 [〜#〜] sbcl [〜#〜] )が完全で再開可能なプロセスイメージを保存する機能はすばらしいですが、これも一意ではありません。 Smalltalk は何十年もの間それを行ってきました。
他の多くの言語では、配列を返すときに構造化代入を許可していますが、# 'valuesと#' multiple-value-bind/let-valuesのアプローチは、Common LISPとSchemeに固有であるようです(「通常の」構造化も可能です)。 )。 Perlの「wantarray」を使用すると、関数はスカラー、リスト、またはvoidのコンテキストで呼び出されているかどうかを判別できるため、戻り値を同様の方法(-ish)で調整できますが、外部で「true」の複数の戻り値を見たことはありませんスキーム/ CLの。
言語機能の点では、LISPがdoできることは他の言語ができないこと(恐らく完全性がそれであるということ)はおそらくありません。しかし、それがであるは、コードが独自のデータ構造で表現され、Big Idea™を作成する言語であり、そのコードはデータです-比較的扱いやすいもの。
何十年にもわたって、LISPだけに特別なものはないと思います。しかし、今日でも、Lispの外部では見つけるのが難しい興味深いことがたくさんあります。頭に浮かぶいくつかのこと:
最後に、言語自体についてではなく、LISPの歴史の一部となり、時間の経過とともに失われた、LISPから学ぶべきことは他にもたくさんあります。例えば。 Interlisp、Symbolics Generaなど... Generaを使用しない場合は、このcomp.lang.LISPを参照してください。LISP thread ここで、Kent Pitmanは、「EmacsはGeneraのZmacsの薄い影にすぎない」と説明しています。 -これは、LISPマシン上で実行されるZmacsの一部である強力なLISPシステムを持つことですべて可能になりました。
それは必ずしも特定の単一機能であるとは限りません。それは全体のルックアンドフィールであり、特定の機能セットがどのように連携するかです。
JavaScriptまたはJavaはLISPの多くの機能(仮想マシン、コンパイラ/エバリュエーター、ガベージコレクションなど)を備えています。しかし、たとえばJavaScriptにはシンボリックプログラミング部分がなく、数学的な機能がありません(内部的にfloatのみ)、エラー処理などがありません。
多くの Common LISP システムは、ソフトウェアを長時間再起動することなく、さまざまなメタプログラミング手法を使用してさまざまな次元でLISP言語を拡張することにより、新しいソフトウェアを段階的に拡張する開発方法に最適化されています。したがって、柔軟で拡張可能である必要がありますが、同時に堅牢である必要があります。プログラムをクラッシュさせることなく言語を変更する(マクロは基本的にユーザーがコンパイラーを拡張する方法です)。
現在は、JavaScriptなどのプログラムを使用して、プログラム(通常はWebブラウザー)を拡張しています。しかし、ほとんどの場合、JavaScriptでのメタプログラミングはそれほど多くありません-一部の [〜#〜] oop [〜#〜] ハッカー以外は。
例:
コンピューター代数のドメイン向けの一般的な高度な数学ソフトウェアを実装するには、主に2つの方法があります。Cでエンジンを特殊な言語( Mathematica など)を上に記述するか、より高度なLISP方言で記述します。 Macsyma/Maximain Common LISP、Reducein Standard LISP、Axiom(Common LISP)。
(Pythonで書かれたものも1つ以上あります。)
Common LISPの上で実行される Axiom のような機能セットを提供するシステムは多くありません。
これらのタイプのアプリケーションでLISPを魅力的にしたのは、高度な基本的な数学(bignum、比率など)、シンボリック計算、対話型コンパイラなどの機能の組み合わせです。これらを低レベルで実装することで、これらを実現することはかなり可能です。レベル言語。このようにして、典型的なLISPシステムの50%以上を実装します。
LISPには多くの方言があり、それぞれに独自の機能セットがあります。他の言語では採用されそうもない私のお気に入りの機能は、 Interlisp の「スパゲッティスタック」です。
スパゲッティスタックはクロージャのようなものですが、ステロイドの上にあります。現在の関数だけでなく、スタックの一番上までのコンテキスト全体を保存します。 co-routine に似ていますが、これらを任意に作成できるため、スタックコンテキストの階層が作成されます。
私の知る限りではありません。 LISPマクロは通常のLISPコードとは異なる機能を使用する傾向があるのに対し、ForthはLISPと同じくらい簡単に動的になり、おそらくForthの動的コードは通常のForthコードのように見えます( Clojure 少なくとも、マクロの外で構文引用符を使用したことはありません)。その結果、通常のLISPコードとは非常に異なって見えます。 Forthの動的な例として、 Forthにコメントを実装する方法 を次に示します。
: ( 41 Word drop ; immediate
( That was the definition for the comment Word. )
( Now we can add comments to what we are doing! )