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 '(
…