2016-08-05 1 views
1

Есть ли способ сделать что-то в лепет, который может сделать как ассоциативный список в другой ассоциативный список, я попробовал:список Ассоциация в другом списке ассоциации

(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

Видя ' '((A B) (B) C) (C. (D. E))) 'напечатан как' ((A. B) (B. C) (CD. E)) 'не является ошибкой. См. [Точка нотации в Схеме] (http://stackoverflow.com/questions/20216711/dot-notation-in-scheme). (Это не связано с тем, что он не создает список ассоциаций как значение в списке ассоциаций.) –

ответ

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

Я думаю, что я нашел,

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