我正在使用PC Scheme TI实施和“计算机程序的结构和解释”一书学习LISP。 PC方案似乎没有“零”变量
[VM ERROR遇到!]变量未在当前环境中定义 NIL
相反'()'似乎有效。 [55](定义一到四(列表1 2 3 4())) ONE-THROUGH四
两者都有相同的含义吗?在PC方案方言中使用无元素序列的正确方法是什么?
感谢。
答案 0 :(得分:4)
当你说这个方言“没有NIL变量”时,你就是两种方式。不仅nil
不存在,而且它似乎被视为可以用作变量的普通符号。它说“变量未定义”。
在nil
具有特殊含义的Lisp方言中,nil
通常不能用作变量。
nil
相当于()
。我的意思是Lisps,它与祖先John MacCarthy Lisp的祖先或模仿有关。 Emacs Lisp和Common Lisp都是这样的。经典Lisps使用nil
作为列表终止符:即(cons 1 nil)
生成列表(1)
Scheme在这个意义上不是经典的Lisp。没有nil
。它使用()
作为空列表的打印表示法,当您在表达式中需要该值时,它会被引用,就像非空列表文字:'()
一样。在Scheme中,(cons 1 nil)
写为(cons 1 '())
。布尔值false由标记为#f
的对象表示。空列表为true而不是false,因此(if '() 1 2)
产生1,而不是像经典Lisp中那样产生2。 '()
和#f
都不是符号。
Scheme也区分大小写。即使您在Scheme中有变量NIL
,它也与nil
无关。您可以将它们用作变量名称。
SICP文本在其前几章中引用了一个名为nil
的变量,该变量保留了'()
的值,从而引起了对该主题的混淆。 Scheme中没有这样的变量;如果你想要这些例子,你必须自己做。这是教科书中一个不幸的方面。
如果定义一个变量nil
,其值为对象'()
,那么SICP的第2章代码可以正常工作,它仍然不等同于一个空的列表,就像它在经典中一样Lisp,因为在经典的Lisp中,nil
和()
是符号的等价符号。符号nil
本身是空列表,反之亦然。它不是仅包含列表的变量的名称。所以引用表达式'nil
也评估为空列表!而在方案'nil
中,即使您已将其定义为包含空列表的变量,也会计算普通符号nil
。
关于第二个问题,“()似乎有效,两者是否具有相同的含义?”。以上涵盖了“相同含义”方面:否,与Scheme中的含义不同。就其运作而言,请考虑R5RS计划报告中的以下引用:
注意:在许多Lisp方言中,空组合()是一个合法的表达式。在Scheme中,组合必须至少有一个子表达式,因此()不是语法上有效的表达式。 [4.1.3程序调用]
因此,()
作为生成空列表的有效表达式的松散处理似乎是行为的PC Scheme扩展,而不是标准Scheme。它接受的表达式不是语法上有效的Scheme表达式。