如何在 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
的链,其中最后一个具有空列表作为 cdr
。 list
只创建适当的列表。例如。
(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
接受两个对象 a
和 b
并构造以下对象:(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
假设我有以下列表:(A B . D)
。
如何仅使用列表函数重现此内容?
(list 'A 'B '. 'D)
不工作。
你不能。创建列表的构造函数是cons
。适当的列表只是空列表或一个或多个 cons
的链,其中最后一个具有空列表作为 cdr
。 list
只创建适当的列表。例如。
(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
接受两个对象 a
和 b
并构造以下对象:(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