Lisp 中不带 nil 的列表

发布于 2024-08-24 06:00:53 字数 190 浏览 2 评论 0原文

我知道在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

薄暮涼年 2024-08-31 06:00:53

在 Lisp 中,正确列表以 NIL 结尾,但也有不正确列表。一种不正确的列表是最后一个 cons 单元在其 CDR 中具有除 NIL 之外的原子的列表。 (1 3 . 2) 正是这样一个不正确的列表。

您甚至可能有不正确的列表,其中根本没有最后一个单元格。 CARCDR 基本上只是指针,因此您可以拥有循环列表!

在 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 than NIL in its CDR. (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. CARs and CDRs 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.

微凉徒眸意 2024-08-31 06:00:53

你拥有的是一个点列表,这是一种不正确列表

最后一个 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.

素衣风尘叹 2024-08-31 06:00:53

值得注意的是,在评估正确列表时会发生什么:

;; A proper list
(cons '+ (cons 5 (cons 10 '())))
⇒ (+ 5 10)
(eval (+ 5 10))
⇒ 15

与评估点列表相比:

;; A dotted list
(cons '+ (cons 5 (cons 10 5000)))
⇒ (+ 5 10 . 5000)
(eval (+ 5 10 . 5000))
⇒ 15

它忽略终止原子。

It's also interesting to note what happens when evaluating proper lists:

;; A proper list
(cons '+ (cons 5 (cons 10 '())))
⇒ (+ 5 10)
(eval (+ 5 10))
⇒ 15

versus evaluating dotted lists:

;; A dotted list
(cons '+ (cons 5 (cons 10 5000)))
⇒ (+ 5 10 . 5000)
(eval (+ 5 10 . 5000))
⇒ 15

It ignores the terminating atom.

倾城泪 2024-08-31 06:00:53

当你迭代一个列表时,当你达到 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文