Lisp 中不带 nil 的列表
我知道在 Lisp 中列表必须以 nil 结尾,但是像这样的表达式
(print (cons 1 (cons 3 2)))
不会抛出任何错误。它打印:
(1 3 . 2)
正确吗?
我正在使用 GNU Clipp。
I know that in Lisp a list must end with nil, but expression like
(print (cons 1 (cons 3 2)))
does not throw any errors. It prints:
(1 3 . 2)
Is it correct?
I'm using GNU Clisp.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在 Lisp 中,正确列表以
NIL
结尾,但也有不正确列表。一种不正确的列表是最后一个 cons 单元在其CDR
中具有除NIL
之外的原子的列表。(1 3 . 2)
正是这样一个不正确的列表。您甚至可能有不正确的列表,其中根本没有最后一个单元格。
CAR
和CDR
基本上只是指针,因此您可以拥有循环列表!在 Common Lisp(CLISP 实现的语言)中,许多标准函数无法使用不正确的列表作为参数。
In Lisp, a proper list ends with
NIL
, but you also have improper lists. One kind of improper list is a list where the last cons cell has an atom other thanNIL
in itsCDR
.(1 3 . 2)
is exactly such an improper list.You can even have improper lists where it doesn't have a last cell at all.
CAR
s andCDR
s are basically just pointers, so you can have circular lists!In Common Lisp (which is the language CLISP implements), many standard functions won't work with improper lists as arguments.
你拥有的是一个点列表,这是一种不正确列表。
最后一个 CDR 为 NIL 的 CONS 单元链是一个 正确列表。
What you have is a dotted list, which is a kind of improper list.
A chain of CONS cells where the last CDR is NIL is a proper list.
值得注意的是,在评估正确列表时会发生什么:
与评估点列表相比:
它忽略终止原子。
It's also interesting to note what happens when evaluating proper lists:
versus evaluating dotted lists:
It ignores the terminating atom.
当你迭代一个列表时,当你达到 nil 时,你就知道你到达了末尾。
您拥有的是包含一辆车和一对积分的列表。
When you iterate over a list you know you reached the end when you hit nil.
What you have is a list with a car and a point pair.