【发布时间】:2013-05-12 10:51:25
【问题描述】:
我正在尝试在 JavaScript 中模拟类似 Lisp 的列表(只是一个没有实际原因的练习),但我正在努力弄清楚如何最好地表示一个空列表。
空列表只是一个 nil 值还是存储在 cons 单元格中?
我可以:
(car '())
NIL
(cdr '())
NIL
但一个空列表肯定不能是(cons nil nil),因为它与存储单个nil 的列表无法区分。它需要存储一些其他特殊值。
另一方面,如果空列表不是从 cons 单元构建的,那么似乎不可能有一个一致的高级接口来将单个值附加到现有列表。像这样的函数:
(defun append-value (list value) ...
会修改它的参数,但前提是它不是一个空列表,这看起来很难看。
【问题讨论】:
-
我将您的帖子编辑为使用
defun而不是来自 Scheme 的define。我没想到你说的是Scheme,因为Scheme没有nil,它不允许你传入一个空列表给car和cdr,以及使用直接列表在 Scheme 社区中,突变更加不受欢迎。 -
还有head sentinel technique,供您个人使用:从非空单例列表开始,例如
(1)或其他;以统一的方式对其进行手术处理并最终返回其cdr。允许以一个额外的 cons 单元分配为代价来简化代码。