Try
(defmacro deffoo (name)
(let ((predicate (intern (format nil "~a-P" name))))
`(sys:multiple-definition ,name deffoo
(blah-blah-blah)
(defun ,predicate (x)
(typep x ',name))
',name)))
I must confess that I cannot understand why this remains undocumented.