(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