怎么做((AB).(CD))在lisp中

dar*_*ode 5 lisp common-lisp cons

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

((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))

知道怎么做到这一点?

Lau*_*ves 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)
Run Code Online (Sandbox Code Playgroud)

记住列表一个利弊细胞."car"是列表的头元素或cons单元的前半部分,cdr是列表的其余部分,或cons单元的第二个元素.

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

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

;Value 14: ((a . b) c . d)
Run Code Online (Sandbox Code Playgroud)


Nie*_*jou 7

只要看看你输入文字时得到的东西((A . B) . (C . D)):

* '((a . b) . (c . d))

((A . B) C . D)

Lisp打印机使用一种定义的算法来打印出由对构建的数据结构.基本上,当它是另一个缺点的CDR时,你不可能得到一个缺点,在括号内打印成点对.

但是,可以通过SET-PPRINT-DISPATCH重新配置打印机,以便获得您正在寻找的行为:

(set-pprint-dispatch 'cons
  (lambda (stream object)
    (format stream "(~W . ~W)" (car object) (cdr object))))
* '((a . b) . (c . d))

((A . B) . (C . D))
* (cons (cons 'a 'b) (cons 'c 'd))  ;The same object

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

尽管如此,如果你习惯于阅读默认行为,那么从长远来看它会更好.


Bnj*_*jmn 0

我不太确定你的意思...我同意上面的评论,即你的代码的最后一行类似于你要匹配的第一行。

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