Lisp中的空列表是否由cons单元构建?

Jan*_*bel 11 lisp null cons

我试图在JavaScript中模拟类似Lisp的列表(只是一个没有实际原因的练习),但我正在努力弄清楚如何最好地表示一个空列表.

一个空列表只是一个nil值还是存在于cons单元格中?

我可以:

(car '())
NIL
(cdr '())
NIL
Run Code Online (Sandbox Code Playgroud)

但是肯定不能列出空列表(cons nil nil),因为它与存储单个列表的列表无法区分nil.它需要存储一些其他特殊价值.

另一方面,如果没有从缺陷单元构建空列表,则似乎不可能具有一致的高级接口以将单个值附加到现有列表.功能如下:

(defun append-value (list value) ...
Run Code Online (Sandbox Code Playgroud)

会修改它的参数,但只有它不是一个空列表,这看起来很难看.

Chr*_*ung 13

空列表只是nil符号(根据定义,符号不是符号).如果给定car,cdr则定义为返回.nilnil

对于列表变异函数,它们返回一个您应该重新分配给变量的值.例如,查看nreverse函数的规范:它可以修改给定列表,也可以不修改给定列表,并且您应该使用返回值,而不是依赖它来就地修改.

甚至nconc,典型的破坏性附加函数也是这样的:它的返回值是你应该使用的附加列表.它指定为就地修改给定列表(除了最后一个),但如果你将它nil作为第一个参数,它就不能很好地修改它,所以你仍然必须使用返回值.


Kaz*_*Kaz 10

信不信由你,这实际上是一个宗教问题.

有迹象表明,有人敢称之为某种Lisp语言中,空列表是conses之外或某种聚合对象,而不仅仅是一个原子一样的方言nil.

例如,在"MatzLisp"(更好地称为Ruby)中,列表实际上是数组.

在NewLisp中,列表是容器:列表类型的对象,其中包含项的链接列表,因此空列表是空容器.[参考].

在不是这种壮观的集群摸索的Lisp语言,空列表是原子,且非空列表是二进制的细胞保持第一项的领域,并持有该列表的其余部分另一个领域.列表可以共享后缀.给出一个(1 2 3)我们可以cons用来创建的列表(a 1 2 3),(b c 1 2 3)两者都共享存储空间(1 2 3).

(在ANSI Common Lisp的,空列表原子()是相同的对象符号nil,其评估其自身,并且还用作布尔假的.在方案,()不是一个符号,并且从布尔假不同#f对象.然而Scheme列表仍然由成对组成,并由原子终止.)

评估的能力(car nil)不会自动从列表中的缺点和比零表示跟随,如果我们看一下古老的Lisp文件,如从1960年年初,一些Lisp的1.5手动,我们会发现,这是不存在的.最初,car严格来说是一种访问cons单元字段的方法,并且严格要求cons单元参数.

诸如允许(car nil)Just Work(以便黑客可以从他们的程序中删除许多无用的代码行)这样的好主意并没有在一夜之间出现.允许的想法(car nil)可能来自InterLisp.在任何情况下,Evolution of Lisp论文声称MacLisp(Common Lisp的重要前身之一,与二十年后出现的Apple Macintosh无关),模仿InterLisp(另一个重要的前身)的这一功能.

像这样的小细节在愉快的编程和监视器上发誓之间产生了区别:例如,参见一个致力于程序增长的短短谣,灵感来自于一个Lisp程序员与一个无法访问空列表的bletcherous方言的斗争car,而不是作为布尔值假.