2010-08-14 78 views
11

我是势在必行的背景,但这些天试LISP我的手意外的输出(Common Lisp的)与利弊()

我读herecons

(利弊x长):

给定一个LISP对象x和列表L,评价(利弊X L)创建包含x,随后在L.

元素

当我故意列表没有使用列表作为第二个参数,即当我使用

(cons 'a 'a)我期待一个错误,但哇!我得到了(A . A)

我错过了什么,什么是(A . A)

回答

7

Cons构建了一个 “cons单元”。这首先与列表无关。 cons单元是一对两个值。一个cons cell以书面形式用“点对”表示,例如其中包含'A'B这两个值。

cons小区中的两个地方被称为“car”和“cdr”。你可以想像这样的缺点小区平分块:

car cdr 
+-----+-----+ 
| A | B | 
+-----+-----+ 

在Lisp中,一个值也可以是别的东西的参考,例如,另一个缺点细胞:

+-----+-----+  +-----+-----+ 
| A | --------> | B | C | 
+-----+-----+  +-----+-----+ 

这将是以“虚线对”形式表示为(A . (B . C))。您可以继续如下:

+-----+-----+  +-----+-----+  +-----+-----+ 
| A | --------> | B | --------> | C | D | 
+-----+-----+  +-----+-----+  +-----+-----+ 

这是(A . (B . (C . D)))。正如你所看到的,在这样一个结构中,值总是在一个cons cell的car中,cdr指向结构的其余部分。最后一个值是例外情况,最后一个值是cdr。不过,我们不需要这个例外:Lisp中有一个特殊值NIL,它表示“无”。通过将NIL进入最后cdr,你有一个方便的标记值,并所有的值在car S:

+-----+-----+  +-----+-----+  +-----+-----+  +-----+-----+ 
| A | --------> | B | --------> | C | --------> | D | NIL | 
+-----+-----+  +-----+-----+  +-----+-----+  +-----+-----+ 

这是一个列表在Lisp的构建。由于(A . (B . (C . (D . NIL))))有点笨拙,它也可以简单地表示为(A B C D)NIL也被称为空列表();对于同一件事,这些是可交换的符号。

现在你可以看到为什么(cons x list)返回另一个列表。 Cons简单地构建在carx另一个缺点细胞,并在cdrlist参考:

+-----+-----+ 
| X | --------> list 
+-----+-----+ 

如果list(A B),它的作品了如:

+-----+-----+  +-----+-----+  +-----+-----+ 
| X | --------> | A | --------> | B | NIL | 
+-----+-----+  +-----+-----+  +-----+-----+ 

所以,(cons x '(a b))评估为(x a b)

列表只是cons单元格的一个非常常见的用法。实际上,您也可以从cons单元或循环列表或任何有向图构建任意树。

1

'a是lisp原子,而(A . A)是称为cons cell或“虚线对”的退化列表。既然你没有在(cons x L)中传递参数L的列表,你找回了一个单元格。

+1

CONS总是返回一个单元格。 – 2010-08-14 09:27:10

1

(CONS×L)个

给定的x和L,CONS返回与X作为细胞和L作为该小区的CDR的CAR新cons单元。

列表是cons单元格的链接链。

CL-USER 141 > (sdraw '(a b c)) 

[*|*]--->[*|*]--->[*|*]---> NIL 
    |  |  | 
    v  v  v 
    A  B  C 

CL-USER 142 > (sdraw (cons 'foo '(a b c))) 

[*|*]--->[*|*]--->[*|*]--->[*|*]---> NIL 
    |  |  |  | 
    v  v  v  v 
FOO  A  B  C 

如果缺点得到两个符号作为参数,它看起来像这样:

CL-USER 143 > (sdraw (cons 'foo 'bar)) 

[*|*]---> BAR 
    | 
    v 
FOO