Copy Tree and Substitute
It is easy to write a function to copy a binary tree:
(defun copy-tree (z) (if (consp z) (cons (copy-tree (first z)) (copy-tree (rest z))) z) )
Why make an exact copy of a tree that we already have? Well, if we modify copy-tree slightly, we can make a copy with a substitution:
; substitute x for y in z (defun subst (x y z) (if (consp z) (cons (subst x y (first z)) (subst x y (rest z))) (if (eql z y) x z)) )
>(subst 'axolotl 'banana '(banana pudding)) (AXOLOTL PUDDING) >(subst 10 'r '(* pi (* r r))) (* PI (* 10 10)) >(eval (subst 10 'r '(* pi (* r r)))) 314.15926535897933