我试图更好地理解如何在不同的 lisp 中评估 S 表达式,并希望看到它们能够处理有趣的格式错误的表达式。我知道 Common Lisp 和 Scheme 是完全不同的语言,但是它们的语义是否存在特定差异来解释行为上的差异。例如,Lisp-1s 和 Lisp-2s 在行为上有明显的差异,卫生与非卫生宏观系统也是如此。
我有一个程序,其中包含在 Scheme 和 Common Lisp 中无法访问的格式错误的if表达式。
;; 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"