PC方案TI实施中的NIL表示

时间:2012-03-08 09:11:57

标签: lisp scheme

我正在使用PC Scheme TI实施和“计算机程序的结构和解释”一书学习LISP。 PC方案似乎没有“零”变量

[VM ERROR遇到!]变量未在当前环境中定义 NIL

相反'()'似乎有效。 [55](定义一到四(列表1 2 3 4())) ONE-THROUGH四

两者都有相同的含义吗?在PC方案方言中使用无元素序列的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:4)

当你说这个方言“没有NIL变量”时,你就是两种方式。不仅nil不存在,而且它似乎被视为可以用作变量的普通符号。它说“变量未定义”。

nil具有特殊含义的Lisp方言中,nil通常不能用作变量。

仅在“经典”Lisps(我的术语)中,

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表达式。