Scheme Nil不是空列表吗?
我正在学习这个计划,正在使用repl.it的在线翻译。我很难理解为什么会返回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
#f
:
(eq?'()'nil);==>#F
在LISP 1.5nil
中,'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时,你跳过了一步。