如何在 lisp 中仅使用列表函数创建带有点对的列表?

How to create a list with a dotted-pair using only list function in lisp?

假设我有以下列表:(A B . D)

如何仅使用列表函数重现此内容?

(list 'A 'B '. 'D) 不工作。

你不能。创建列表的构造函数是cons。适当的列表只是空列表或一个或多个 cons 的链,其中最后一个具有空列表作为 cdrlist 只创建适当的列表。例如。 (list 'a 'b 'c) 是一个执行 (cons 'a (cons 'b (cons c '()))).

的函数

(a b . d) 是用 (cons 'a (cons 'b 'd)) 创建的。它不是一个合适的列表,因为它以 d 而不是 nil 终止。因此不可能用 list.

创建这个结构

我不确定你在这里真正想做什么,但这似乎正是 list* 的目的:

CL-USER> (list* 'a 'b 'd)
(A B . D)

你不能。通过考虑 list 的简单 two-argument 版本,很容易看出这一点,我将其称为 lst:

lst 接受两个对象 ab 并构造以下对象:(a . (b . nil)),它看起来像这样:

然后很容易看出 b 没有值,这将导致这种链中最后一个缺点的 cdr 不是 nil(又名 ()).因此 lst,因此 list,不能构造一个 conses 链,其中最后一个 cons 的 cdr 不是 nil,这意味着它不能构造一个虚线列表,因为那是虚线列表的定义。

我们几乎可以用 list 做到这一点,但不完全是。重点是 list 坚持将 nil 放在列表的末尾,但我们希望在末尾有一个非 nil 值。

因此我们可以在列表末尾以外的任何地方添加一个带点的术语。

我可以给你:

(list 'a '(b . c) 'd) ; has a normal list end of 'd -> 'nil
(list 'a '(b . c))    ; looks like b . c is at the end, but actually 'a is