我试图更好地理解S表达式在不同Lisp中的评估方式,并希望看到它们能够处理有趣的不合格表达式。我知道Common Lisp和Scheme是完全不同的语言,但是它们的语义在解释行为上的差异方面存在特定的差异。例如,Lisp-1和Lisp-2在行为方面有明显的差异,卫生型和非卫生型宏观系统也有差异。无法到达Ill-expression if-expression在Scheme中是语法错误,但不是Common Lisp
我有一个程序,其中包含在Scheme和Common Lisp中表达式表达式无法到达的不合格。
;; foo.scm
(if #t 1 (if))
(display "12")
而Common Lisp的版本
;; foo.lisp
(if t 1 (if))
(display "12")
chicken
和guile
都产生一个语法错误。
鸡:
% chicken foo.scm
Syntax error: (foo.scm:1) in `if' - pair expected
(if)
Expansion history:
<syntax> (##core#begin (if #t 1 (if)))
<syntax> (if #t 1 (if))
<syntax> (##core#if #t 1 (if))
<syntax> (if) <--
狡诈:
% guile foo.scm
...
.../foo.scm:1:9: source expression failed to match any pattern in form (if)
sbcl
和clisp
两个打印12和发射无警告。
SBCL:
% sbcl --load foo.lisp
This is SBCL 1.3.11, an implementation of ANSI Common Lisp.
...
12
0]^D
CLISP
% clisp foo.lisp
"12"