Copy Tree and Substitute
It is easy to write a function to copy a binary tree:
(defn copy-tree [form] (if (cons? form) (cons (copy-tree (first form)) (copy-tree (rest form))) form) )
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 new for old in form (defn subst [new old form] (if (cons? form) (cons (subst new old (first form)) (subst new old (rest form))) (if (= form old) new form) ) )