; Basic pattern matcher ; Patterns may contain: ; atom match itself ; ? match any atom ; * match one or more atoms ; >atom match any atom, SET atom to it ; *atom match one or more atoms, SET atom to list ; (RESTRICT patvar pred) ; match patvar [either ? or a >atom] iff pred (DE MATCH (P D) , (COND , , ((AND (NULL P) (NULL D)) T) , , ((OR (NULL P) (NULL D)) NIL) , , ( , , , (AND (NOT (ATOM (CAR P))) , , , , (EQUAL (CAAR P) 'RESTRICT) , , , , (EQUAL (CADAR P) '?) , , , , (EVAL (CONS 'AND , , , , , (MAPCAR , , , , , , (CDDAR P) , , , , , , '(LAMBDA (PRED) , , , , , , , (FUNCALL PRED (CAR D)) , , , , , , ,,,) , , , , , ,,,) , , , , ,,,)) , , , ,,,) , , , (MATCH (CDR P) (CDR D)) , , ,,,) , , ( , , , (AND (NOT (ATOM (CAR P))) , , , , (EQUAL (CAAR P) 'RESTRICT) , , , , (EQUAL (ATOMCAR (CADAR P)) '>) , , , , (EVAL (CONS 'AND , , , , , (MAPCAR , , , , , , (CDDAR P) , , , , , , '(LAMBDA (PRED) , , , , , , , (FUNCALL PRED (CAR D)) , , , , , , ,,,) , , , , , ,,,) , , , , ,,,)) , , , , (MATCH (CDR P) (CDR D)) , , , ,,,) , , , (SET (ATOMCDR (CADAR P)) (CAR D)) , , , T , , ,,,) , , ( , , , (OR (EQUAL (CAR P) '?) , , , , (EQUAL (CAR P) (CAR D)) , , , ,,,) , , , (MATCH (CDR P) (CDR D)) , , ,,,) , , ( , , , (AND (ATOM (CAR P)) , , , , (EQUAL (ATOMCAR (CAR P)) '>) , , , , (MATCH (CDR P) (CDR D)) , , , ,,,) , , , (SET (ATOMCDR (CAR P)) (CAR D)) , , , T , , ,,,) , , ( , , , (EQUAL (CAR P) '*) , , , (COND ((MATCH (CDR P) (CDR D))) , , , , ((MATCH P (CDR D))) , , , ,,,) , , ,,,) , , ( , , , (AND , , , , (ATOM (CAR P)) , , , , (EQUAL (ATOMCAR (CAR P)) '*) , , , ,,,) , , , (COND , , , , ((MATCH (CDR P) (CDR D)) , , , , , (SET (ATOMCDR (CAR P)) (LIST (CAR D))) , , , , , T , , , , ,,,) , , , , ((MATCH P (CDR D)) , , , , , (SET (ATOMCDR (CAR P)) , , , , , , (CONS (CAR D) (EVAL (ATOMCDR (CAR P)))) , , , , , ,,,) , , , , , T , , , , ,,,) , , , ,,,) , , ,,,) , ,,,) ,,,)