谁能告诉我mit-scheme中的空值表示是什么?在SICP书中,它应该是“零”但它不起作用。 谢谢。
答案 0 :(得分:21)
'()
应该有效。基本上,scheme中的nil是空列表,因此引用空列表会给你nil。
答案 1 :(得分:10)
原创(破碎):http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions
上述常见问题解答中的文字(如果是互联网档案破损):
快速回答是:nil不再是Scheme的一部分,而是使用'()
。答案很长......
第2章中的早期示例使用nil
作为列表终止符,但是当使用(例如)MIT Scheme运行这些示例时,您会得到:
;Unbound variable: nil
同样,使用()
或null
代替nil
可能会对某些实现起作用,但两者都不可移植。向导书解决了此脚注中的问题
令人瞩目的是,Lisp方言标准化中的多少能量已经在几乎没有任何东西的论证中消散了:应该是一个普通的名字吗? nil的值应该是符号吗?它应该是一个清单吗?它应该是一对吗?在Scheme中,nil是一个普通的名称,我们在本节中将其用作一个变量,其值是列表末尾标记(正如true是具有真值的普通变量)。 Lisp的其他方言,包括Common Lisp,将nil视为特殊符号。本书的作者曾经忍受过太多的语言标准化争吵,他们希望避免整个问题。一旦我们在2.3节中引入了引用,我们将空列表表示为'()并完全省略变量nil。
由于这是写的,nil已经从Scheme标准中删除了 - 但是底线是:使用'(),而不是nil。 Mike在给电子清单的电子邮件中指出:
这是一个麻烦的事情,这个nil / null /'()业务。 Scheme48和 scm不定义null,guile定义它,但作为类似的过程 常见的lisp的null(与其nil一样,其行为类似于cl的nil, 它本身与'()不同 - 可能这有什么关系 与fsf的计划在guile重新做emacs)。我认为最好的选择是 用'()。
代替作者对nil的使用
[只需轻轻一点印刷清理,就可以更好地将Markdown和常用的ASCII输入匹配到相关的语言/实现中。]
答案 2 :(得分:1)
我使用MIT/GNU Scheme microcode 15.3
,()
和'()
都可以。 (正如您所说,nil
和null
不起作用。)
1 ]=> ()
;Value: ()
1 ]=> '()
;Value: ()
1 ]=> (cons 1 ())
;Value 2: (1)
1 ]=> (cons 1 '())
;Value 3: (1)
答案 3 :(得分:0)
(list)'()和()可以表示null。例如,
(define (transpose mat) (accumulate-n cons () mat))
或用()或(列表)替换()。