Scheme Nil不是空列表吗?

Scheme Nil不是空列表吗?,scheme,lisp,Scheme,Lisp,我正在学习这个计划,正在使用repl.it的在线翻译。我很难理解为什么会返回#f: (eq?'()'nil);==>#F 在LISP 1.5nil中,'nil,'()和()的计算结果为nil。读者将()和nil翻译成同一个单例空列表,并且它是自评估的,因此引号是可选的nil也是唯一的假值,所有其他值都是真值。第一个方案实现由兼容1.5的商业Lisp托管,并且在第一个方案中透明地使用了大部分主机。Common Lisp是1.5的后代,仍然像这样工作,但Scheme在不同的报告中有所变化,以下是R5

我正在学习这个计划,正在使用repl.it的在线翻译。我很难理解为什么会返回
#f

(eq?'()'nil);==>#F

在LISP 1.5
nil
中,
'nil
'()
()
的计算结果为
nil
。读者将
()
nil
翻译成同一个单例空列表,并且它是自评估的,因此引号是可选的
nil
也是唯一的假值,所有其他值都是真值。第一个方案实现由兼容1.5的商业Lisp托管,并且在第一个方案中透明地使用了大部分主机。Common Lisp是1.5的后代,仍然像这样工作,但Scheme在不同的报告中有所变化,以下是R5RS和更高版本的规则:

空列表是
”()
。它被引用并计算为
()
。它不是自评估的,因此
()
是无效的方案代码
'nil
求值为
nil
,它是一个符号,而不是空列表。在Scheme中,唯一的假值是
#f
,因此空列表是真实的

代码:

'()            ; ==> () 
'(1 . (2 . ()) ; ==> (1 2)
()             ; ==>  ERROR: Illegal empty application (not allowed)
(eq? '() 'nil) ; ==> #f (empty list and nil are different values)
(if '() #t #f) ; ==> #t (empty list is truthy)

也许这是吹毛求疵,但我认为空列表'()的计算结果是正确的。事实上,它被“display”打印成“()”是一个历史性的错误。这同样适用于诸如“nil”之类的符号。@JohnClements该标准清楚地表明,
'x
的计算结果为
x
。但是
x
不会求值到
x
,除非它是自评估的。在racket中,
1
实际上在完全扩展的程序中被引用,而
()
仍然是非法的
'()
求值为
()
,因此球拍打印是
'()
,因为它求值为
()
。它是所选择的可视化,就像用十六进制而不是十进制打印数字一样,不是一个不同的值。@JohnClements表单
()
不是空列表,它是
(引号())
,它的计算结果是
()
<代码>()
是一个错误。您的还原语义与我的不同。我声称我的是(a)一致的,(b)更简单的。查看DrRacket BSL中的步进器,了解我的意思。@Sylvester恭敬地表示不同意。标准很清楚,x的计算结果是一个特定的符号。“display”函数将该值打印为字符串“x”。当你说“x”的计算结果为x时,你跳过了一步。