Few days ago I’ve hacked a simplistic BDD for Common Lisp. I’m still having fun improving it. Here you are an improved respond-to? that supports generics much better.
(defun respond-to? (o method &rest args)
(restart-case
(handler-bind ((undefined-function #'(lambda (c)
(declare (ignore c))
(invoke-restart 'no)))
(simple-error #'(lambda (c)
(declare (ignore c))
(invoke-restart 'no))))
(let ((sf (symbol-function method))
(cpl (sb-pcl::class-precedence-list (class-of o))))
(typecase sf
(standard-generic-function
(find t
(mapcar #'(lambda (klass)
(not (null
(find-method sf '()
(cons klass
(mapcar #'(lambda (c) (declare (ignore c)) t) args)) nil))))
cpl)))
(function t))))
(no (&optional v)
nil)))
Though for non-generic functions there seems to be no way to check if actually object “responds” to function without actually evaluating it.
Anyway, it’s quite funny!




