dynamic binding should let you use the pattern matching m2 for any variable. (defun your_matcher(... ltvar) (declare (special var *par*)) (let ((var ltvar)) .... now you can call m2 )