有没有办法在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.'.
答案 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)