Association Lists, Property Lists and Trees
;; Association lists (alists)
(defparameter *ages* '((ana . 30) (bo . 25) (cy . 41)))
(assoc 'bo *ages*) ; (BO . 25)
(cdr (assoc 'bo *ages*)) ; 25
(assoc "bo" '(("ana" . 1) ("bo" . 2)) :test #'string=) ; ("bo" . 2)
(rassoc 41 *ages*) ; (CY . 41)
(acons 'dee 22 *ages*) ; adds to the front (non-destructive)
(pairlis '(a b) '(1 2)) ; ((B . 2) (A . 1)) (order may vary)
;; Property lists (plists)
(defparameter *person* (list :name "Ana" :age 30))
(getf *person* :age) ; 30
(getf *person* :email "none") ; "none" (default)
(setf (getf *person* :age) 31)
(remf *person* :age)
(destructuring-bind (&key name age) (list :name "Bo" :age 25) (list name age)) ; ("Bo" 25)
;; Symbol property lists
(setf (get 'apple 'color) 'red)
(get 'apple 'color) ; RED
;; Trees
(defparameter *tree* '(1 (2 (4) (5)) (3 (6))))
(defun tree-sum (tree)
(cond ((null tree) 0)
((atom tree) tree)
(t (+ (tree-sum (car tree)) (tree-sum (cdr tree))))))
(tree-sum *tree*) ; 21
(copy-tree *tree*)
(subst-if 0 #'numberp '(
…