我试图在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)
会修改它的参数,但只有它不是一个空列表,这看起来很难看.
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
,而不是作为布尔值假.