另一个关联列表中的关联列表

时间:2016-08-05 15:55:02

标签: lisp common-lisp

有没有办法在lisp中创建可以像其他关联列表中的关联列表那样做的东西,我试过了:

(setq alist '((A . B) (B . C) (C . (D . E))))

但它给出了:

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

然后执行以下操作:

(assoc 'd (assoc 'c alist))

我收到此错误:

Maximum error depth exceeded (22 nested errors) with
'The value C is not of type LIST.'.

2 个答案:

答案 0 :(得分:4)

((A . B) (B . C) (C . (D . E)))不是嵌套的关联列表。

((A . B)
 (B . C)
 (C . (D . E))  ; <-  (d . e)  is not an assoc list. Just one association.
)

您想要一个关联列表:((d . e))

这就是这个解决方案:

CL-USER 5 > (assoc 'C '((A . B) (B . C) (C . ((D . E)))))
(C (D . E))

CL-USER 6 > (assoc 'd (cdr (assoc 'C '((A . B) (B . C) (C . ((D . E)))))))
(D . E)

请注意,'(C . (D . E))(C D . E)都是相同结构的列表,只是写的不同:

CL-USER 8 > (equal '(C . (D . E)) '(C D . E))
T

答案 1 :(得分:1)

我想我找到了,

(setq alist '((A . B) (B . C) (C . ((D . E)))))
(assoc  'd  ( cdr ( assoc 'c alist))) => (D . E)