Adăugarea unui element în capul unui alist (lista asociativă) este suficient de simplă:
> (cons '(ding . 53) '((foo . 42) (bar . 27)))
((ding . 53) (foo . 42) (bar . 27))
Adăugarea la coada unui alist este un pic mai complicat totuși. După unele experimentări, am produs acest lucru:
> (define (alist-append alist pair) `(,@alist ,pair))
> (alist-append '((foo . 42) (bar . 27)) '(ding . 53))
'((foo . 42) (bar . 27) (ding . 53))
Totuși, mi se pare că aceasta nu este soluția idiomatică. Deci, cum se procedează de obicei în schemă? Sau este chiar așa?
Nu adăugați la o listă. Vă aflați pe o listă.
O listă a este un set logic de asociații. Nu vă interesează ordinea elementelor dintr-un set. Tot ce vă interesează este prezența sau absența unui anumit element. În cazul unei liste a, tot ce vă interesează este dacă există o asociere pentru o anumită etichetă (adică o pereche a cărei CAR este valoarea specificată) și, având în vedere asocierea, valoarea asociată (adică în această punerea în aplicare, CDR a perechii).
Common Lisp definește o funcție numită ACONS exact în acest scop, unde
(acons key value alist)
este echivalent cu:
(cons (cons key value) alist)
Acest lucru sugerează că simpla constatare a unui alist este idiomatică. Rețineți că aceasta înseamnă două lucruri: