2016-08-05 37 views
1

Gibt es eine Möglichkeit, etwas in Lisp zu machen, die wie eine Zuordnungsliste in einer anderen Zuordnungsliste tun, habe ich versucht:Verband Liste in einer anderen Verband Liste

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

aber es gibt:

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

und dann ein etwas wie:

(assoc 'd (assoc 'c alist)) 

und ich bekomme diese Fehlermeldung:

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

Sehen ' '((A B) (B) C) (C. (D. E))) "gedruckt als" ((A. B) (B. C) (CD. E)) ist kein Fehler. Siehe [Punktnotation in Schema] (http://stackoverflow.com/questions/20216711/dot-notation-in-scheme). (Dies ist abgesehen davon, dass es keine Assoziationsliste als Wert in einer Assoziationsliste erzeugt.) –

Antwort

4

((A . B) (B . C) (C . (D . E))) nicht eine verschachtelte Assoc Liste ist.

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

Sie möchten eine Liste der Verbände haben: ((d . e)).

Welche es diese Lösung macht:

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) 

Beachten Sie, dass '(C . (D . E)) und (C D . E) sind beide Listen der gleichen Struktur, nur anders geschrieben:.

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

Ich glaube, ich es gefunden,

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