2017-02-10 37 views
0

一些LISP表达式求自己(的例子是MIT的方案REPL,虽然GNU Common Lisp的同意):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中的形式主义(如抽象重写系统)有何不同?什么替代形式主义在LISPs中获得评估?或者更准确地说,“大多数主要的LISP”,比如CL,Clojure和Scheme。[0]但我会对不那么有名的反例感兴趣!

+3

没有“范式”在Lisp和评价不转换到正常形态。所有数据(除符号和列表之外)评估为themselve只是在后来的Lisp方言中定义。 Lisp不是lambda演算的实现。它使用特定类型的评估者。 –

回答

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语言,斯坦福大学人工智能实验室的备忘录1979年由J.麦卡锡,第6页