Match Function
(defn equal [x y] (if (cons? x) (and (cons? y) (equal (first x) (first y)) (equal (rest x) (rest y))) (= x y) )) (defn matchb [pat inp bindings] (if (cons? bindings) ; if not, already failed (if (cons? pat) ; if pat is a cons (and (cons? inp) ; inp must be a cons (matchb (rest pat) ; parts must match (rest inp) (matchb (first pat) (first inp) bindings))) (if (varp pat) ; not a cons: a var? (if (assocl pat bindings) (and (equal inp ; existing binding (second (assocl pat bindings))) bindings) (cons (list pat inp) bindings)) (and (= pat inp) bindings)))) ) (defn match [pat inp] (matchb pat inp '((t t))))