假设我定义
(defclass test-class ()
((greet :accessor greet
:initform "Hi")))
和
(defmethod test-method ((instance test-class))
(print (greet instance)))
为什么
(fboundp 'test-method)
的计算结果为 t
,而 (fboundp #'test-method)
的计算结果为 nil
,而 (functionp 'test-method)
和 (functionp #'test-method)
则相反?我认为 CLOS 中的方法只是与特定泛型相关的函数,然后根据参数的类型进行调度。
我问这个是因为我试图定义一个函数来检查符号是否是方法:
(defun check-method (method specializers)
(and (fboundp method) (find-method method nil specializers nil)))
当我调用
(check-method #'test-method '(test-class))
但出错时,(check-method 'test-method '(test-class))
会出错,表示给定参数,find-method
没有适用的方法。我希望对函数和方法的本质有所了解会有所帮助。
fboundp
测试symbol(名称)是否已分配其函数槽,functionp
测试其参数本身是否是一个函数,而不是一个函数的名称。
所以
(fboundp 'test-method)
是 t
,因为符号 test-method
有一个与之关联的函数,并且 (fboundp #'test-method)
应该引发错误,因为它的参数不是符号(你真的得到 nil
吗?您使用的是 Common Lisp 实现吗?)。
(functionp 'test-method)
是 nil
,因为它的参数是一个符号,但 (functionp #'test-method)
是 t
,因为它正在获取一个函数。