(in-package :cl-user) (defgeneric add (x y) (:method ((x integer) (y integer)) (+ x y)) (:method ((x integer) (y vector)) ;; ... )) (defgeneric make-adder (x y) (:method ((x integer) (y integer)) (lambda (x y) (+ x y))) (:method ((x integer) (y vector)) ;; ... )) (defun test-add () (loop :for i :from 0 :to 10000000 :for j :from 0 :to 10000000 :do (add i j))) (defun test-adder () (let ((adder (make-adder 1 1))) (loop :for i :from 0 :to 10000000 :for j :from 0 :to 10000000 :do (funcall adder i j)))) ;;; Test CL-USER> (time (test-add)) (TEST-ADD) took 963,386 microseconds (0.963386 seconds) to run. During that period, and with 4 available CPU cores, 963,446 microseconds (0.963446 seconds) were spent in user mode 1 microseconds (0.000001 seconds) were spent in system mode 400 bytes of memory allocated. NIL CL-USER> (time (test-adder)) (TEST-ADDER) took 91,878 microseconds (0.091878 seconds) to run. During that period, and with 4 available CPU cores, 91,696 microseconds (0.091696 seconds) were spent in user mode 0 microseconds (0.000000 seconds) were spent in system mode 400 bytes of memory allocated. NIL