80

このサイトでは、10個のLISPプリミティブがあると彼らは言っています。プリミティブは次のとおりatom, quote, eq, car, cdr, cons, cond, lambda, label, applyです。

http://hyperpolyglot.wikidot.com/lisp#ten-primitives

スティービーは7つ(または5つ)あると考えています:

LISPのアイデアの純粋さの一部です。完全なマシンを構築するために必要なのは7つ(または5つですか?)のプリミティブだけです。 http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

LISPマシン(つまり、LISPコードでeval / value関数を実行できるもの)を構築するためのプリミティブの最小数はいくつですか?(そして、それらはどれですか?)

(私はあなたがなくても生きることができることを理解できますatom, label and apply

4

6 に答える 6

58

基本的な述語/F 関数

McCarthy初等 S 関数と述語は次のとおりです。

  1. atom

    car と cdr はリストに対してのみ定義されているため、これが必要でした。つまりcar、アトムを指定した場合に何が起こっているかを示すために、いかなる種類の回答も当てにできません。

  2. eq

    アトム間の同等性をテストするため。

  3. car

    コンスセルの前半 (アドレス) を返します。(アドレスレジスタの内容)。

  4. cdr

    コンス セルの後半 (デクリメント) を返します。(減分レジスタの内容)。

  5. cons

    cons への最初の引数を含むアドレスの半分と、2 番目の引数を含むデクリメントの半分を使用して、新しいコンス セルを作成します。

まとめる: S-Function

その後、彼は基本的な表記法に追加し、彼が S-Function と呼んだものを記述できるようにしました。

  1. quote

    式を評価せずに表すこと。

  2. cond

    前述の述語で使用される基本的な条件。

  3. lambda

    関数を表す。

  4. label

    彼は再帰のためにこれを必要としませんでしたが、Y-Combinatorについては知らなかったかもしれません( Paul Graham によると)、彼は利便性と簡単な再帰を可能にするためにこれを追加しました。


つまり、彼が Lisp マシン用に 9 つの基本的な「演算子」を実際に定義したことがわかります。あなたの別の質問に対する以前の回答で、このシステムで数値を表現して操作する方法を説明しました。

しかし、この質問に対する答えは、Lisp マシンに何を求めるかによって異なります。labelすべてを機能的に構成し、Y-コンビネーターを適用して再帰を取得できるため、関数なしで実装できます。

atomcarアトムに対する操作を return に定義した場合、破棄される可能性がありますNIL

これら 9 つの定義済みプリミティブのうち 7 つを備えた McCarthy の LISP マシンを本質的に持つこともできますが、表向きは、自分自身にどの程度の不便を課したいかによって、より簡潔なバージョンを定義することもできます。私は彼のマシンが非常に優れていること、または Clojure のような新しい言語の多くのプリミティブが好きです。

于 2010-08-14T16:39:12.367 に答える
15

これを実際に確実に知る最善の方法は、実装することです。3 つのサマーを使用して、 Brainfuckで動作する McCarty 風の LISP であるZozotezを作成しました。

必要なものを見つけようとしましたが、フォーラムで、ラムダのみが必要であるというスレッドを見つけることができます。したがって、ラムダ計算でLISP全体を作成できます。面白いと思いましたが、最終的に副作用があり、現実の世界で機能するものが必要な場合は、ほとんど方法がありません.

チューリングの完全な LISP については、ポール グラハムのマッカーシーの論文の説明を使用しましたが、本当に必要なのは次のとおりです。

  • シンボル評価
  • 専用フォームお見積り
  • 特殊形式 if (または cond)
  • 特別な形式のラムダ (quote に似ています)
  • 関数式
  • 関数アトム
  • 関数の短所
  • 機能車
  • 関数 cdr
  • 関数ディスパッチ (リストラムダ)

10. これに加えて、ただの製図板ではなく、テストできる実装を用意するには、次のようにします。

  • 関数読み取り
  • 関数書き込み

12. 私のZozotezでは、 set と flambda (lambda のような匿名マクロ) も実装しました。ファイル I/O を除いて、動的にバインドされた Lisp (Elisp、picoLisp) を実装するライブラリをフィードすることができます (基礎となる BF は stdin/stdout 以外をサポートしていないため)。

言語がどのように実装されているかを完全に理解するために、LISP と (LISP ではなく) 両方で LISP1 インタープリターを実装することをお勧めします。LISP の構文は非常に単純であるため、パーサーの出発点として適しています。私は現在、さまざまなターゲット (ターゲット C 用のスターリンなど) を持つスキームで記述されたスキーム コンパイラに取り組んでいます。できれば BF もその 1 つです。

于 2013-02-28T22:13:14.717 に答える
10

McCarthy は、元の Lisp を定義するために 7 つの演算子を使用しました: quoteatomeqcar、および。この記事では、彼の足跡をたどります。cdrconscond

于 2010-08-14T10:21:24.233 に答える
8

このFAQ は次のように述べています。

プリミティブの「最適な」最小セットは 1 つではありません。それはすべて実装に依存します。たとえば、数値のような基本的なものでさえ、プリミティブである必要はなく、リストとして表すことができます。プリミティブの 1 つの可能なセットには、S 式の操作用の CAR、CDR、および CONS、S 式の入出力用の READ および PRINT、インタープリターのガット用の APPLY および EVAL が含まれる場合があります。ただし、関数には LAMBDA、等価には EQ、条件には COND、代入には SET、定義には DEFUN を追加したい場合があります。QUOTE も便利かもしれません。

これは、School of Computer Science、Carnegie Melon の Web サイトからのものです。

于 2010-08-14T07:48:53.160 に答える
2

Paul Grahamは、7を使用してevalを実装します。

マッカーシーのLISP用マイクロマニュアルでは、彼は10を使用してevalを実装しています。

于 2010-09-10T08:51:31.190 に答える