2017-02-10 7 views
0

式がそれ自身に評価いくつかのLISP(例はGNU Common Lispのは同意するものの、MIT-スキームREPLです):LISPリストと正規形

1 ]=> 3 
;Value: 3 

、通常の形態です。したがって、発現の評価(例えば、(+ 2 1))は、正常な形態への変換であると適切に言える。それは私がいつも正式に評価を理解してきたからです。

しかし、私たちが困っているリストを持つ:

1 ]=> (list 3 2) 
; Value 16: (3 2) 
1 ]=> (3 2) 
;The object 3 is not applicable. 
;To continue, call RESTART with an option number: 
; (RESTART 2) => Specify a procedure to use in its place. 
; (RESTART 1) => Return to read-eval-print level 1. 

私は右のそれを考えでアム:

  1. (多くの[0])のLispは(非のための通常のフォームを持っていません
  2. (多くの)LISPには、評価が通常のフォームに還元されているという特性はありませんか?

もしそうなら、これは抽象的な書き換えシステムのようなPLTの形式に幾分似ていませんか? LISPの評価を取得するにはどのような代替形式がありますか?


[0]又はおそらくより正確に、例えばCl、Clojureの、及び方式として、 "著名のLispの最も"。しかし、あまり知られていない反例に興味があります。

+3

によっては全く「通常の形式は、」Lispではありませんし、評価が正規形への変換ではありません。それは、シンボルやリスト以外のすべてのデータが、それまでに評価されているのは、後のLisp方言の定義によるものであるということです。 Lispはラムダ計算の実装ではありません。特定のタイプの評価者を使用します。 –

答えて

2

Lispは、いくつかのプリミティブ演算子でのみ定義できます。 How many primitives does it take to build a LISP machine? Ten, seven or five?あなたは、あなたがそれらに拡大することから得るための通常のフォームがあると考えることができます。

しかし、Lispはラムダ計算ではありません。 What type of lambda calculus would Lisp loosely be an example of?

そしてLisp wasn't designed to be like the lambda calculus

引数として関数を使用するためには、機能のための表記法を必要とし、教会のラムダ表記を使用することが自然なようです。私は本の残りの部分を理解していなかったので、関数を定義するためのより一般的な仕組みを実装しようとする誘惑はありませんでした。
- Lispの歴史、スタンフォードAI研究所のメモ1979 J.マッカーシー、6ページ