5

我试图弄清楚如何使用缺点来做到这一点:

((A . B) . (C . D))

每个缺点单元格的位置(A . B)和位置(C . D)

我试过这样做,(cons (cons 'a 'b) (cons 'c 'd))但它给了我这个:

((A.B) C . D)

我也试过这个:(cons (cons 'a 'b) (cons (cons 'c 'd) ()))但它给了我这个:

((A . B) (C . D))

知道如何实现这一目标吗?

4

4 回答 4

15

第一个是你想要的。它们是等价的。你可以这样验证:

1 ]=> (cons (cons 'a 'b) (cons 'c 'd))

;Value 11: ((a . b) c . d)

1 ]=> (car (cons (cons 'a 'b) (cons 'c 'd)))

;Value 12: (a . b)

1 ]=> (cdr (cons (cons 'a 'b) (cons 'c 'd)))

;Value 13: (c . d)

请记住,列表一个缺点单元格。“car”是列表的头元素或 cons 单元的前半部分,而 cdr 是列表的其余部分,或 cons 单元的第二个元素。

另一种验证它们是否等效的方法:

1 ]=> '((a . b) . (c . d))

;Value 14: ((a . b) c . d)
于 2010-12-15T01:50:00.200 回答
7

看看你输入文字时得到的结果((A . B) . (C . D))

* '((A B C D))

((A B C D)

Lisp 打印机使用一种定义的算法来打印由对构建的数据结构。基本上,当它是另一个 cons 的 CDR 时,您永远无法将 cons 打印为圆括号内的虚线对。

但是,可以通过SET-PPRINT-DISPATCH重新配置打印机,以便获得所需的行为:

(set-pprint-dispatch '缺点
  (lambda (流对象)
    (格式流“(~W .~W)”(汽车对象)(cdr对象))))
* '((A B C D))

((A B C D))
* (cons (cons 'a 'b) (cons 'c 'd)) ;同一个对象

((A B C D))

尽管如此,坦白地说,从长远来看,如果您对阅读默认行为感到满意,那会更好。

于 2010-12-15T01:47:31.703 回答
0

由于列表在 Lisp 中的表示方式,您正在寻找的内容是不可能的。创建列表时,您正在创建一系列 cons 单元格,其中单元格的 car 是列表中该元素的值,而 cdr 是对下一个 cons 单元格的引用。您想要的单元格,((A . B) . (C . D))意思是“创建一个 cons 单元格,其中汽车(A . B)和 cdr 是(C . D)”。这相当于一个列表,其中第一个元素是(A . B),第二个元素是C,并且列表的尾部是D, 或((A . B) C . D)

于 2010-12-15T01:49:57.407 回答
0

我不太清楚你的意思......我同意上面的评论,你的代码的最后一行类似于你正在匹配的第一行。

无论如何,这里有一个不错的通用资源:http ://www-2.cs.cmu.edu/~dst/LispBook/

于 2010-12-15T01:33:09.643 回答