(defun equal-lambda-exp (a b) (let ((vars (init-matching-variables (lambda-variables a))) (result (match a b))) (clear-matching-variables vars) (if (eq 'fail result) nil t))) (defun lambda-variables (e) (remove-if #'null (mapcar #'(lambda (x) (cond ((symbolp x) (if (char= (char (symbol-name x) 0) #\&) nil x)) ((consp x) (if (atom (first x)) (first x) (second (first x)))))) (second e))))lambda-variablesは,ラムダ式の引数(ラムダリスト) の中の変数のみを拾い集める関数である.
> (lambda-variables '(lambda (x y) (list x y))) (X Y) > (lambda-variables '(lambda (x &rest args) (list x args))) (X ARGS) > (lambda-variables '(lambda (x &key a (b 10)) (list x a b))) (X A B) > (lambda-variables '(lambda (&key ((:abc a) 10)) (list a))) (A)equal-lambda-expの例は以下のようになる.
> (equal-lambda-exp '(lambda (x y) (list x y)) '(lambda (a b) (list a b))) T > (equal-lambda-exp '(lambda (x y) (list x y)) '(lambda (y) (list y))) NIL > (equal-lambda-exp '(lambda (&key x (y 10)) (list x y)) '(lambda (&key a (b 10)) (list a b))) T > (equal-lambda-exp '(lambda () (fib 1)) '(lambda () (fib 1))) T