(defun list-match (x y &optional binds) (acond2 ((or (eql x y) (eql x '_) (eql y '_)) (values binds t)) ((binding x binds) (list-match it y binds)) ((binding y binds) (list-match x it binds)) ((varsymp x) (values (cons (cons x y) binds) t)) ((varsymp y) (values (cons (cons y x) binds) t)) ((and (consp x) (consp y) (list-match (car x) (car y) binds)) (list-match (cdr x) (cdr y) it)) (t (values nil nil))))Source Context