为什么 `(fboundp #'method)' 返回 nil?

问题描述 投票:0回答:1

假设我定义

(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
没有适用的方法。我希望对函数和方法的本质有所了解会有所帮助。

oop common-lisp
1个回答
0
投票

fboundp
测试symbol(名称)是否已分配其函数槽,
functionp
测试其参数本身是否是一个函数,而不是一个函数的名称。

所以

(fboundp 'test-method)
t
,因为符号
test-method
有一个与之关联的函数,并且
(fboundp #'test-method)
应该引发错误,因为它的参数不是符号(你真的得到
nil
吗?您使用的是 Common Lisp 实现吗?)。

(functionp 'test-method)
nil
,因为它的参数是一个符号,但
(functionp #'test-method)
t
,因为它正在获取一个函数。

© www.soinside.com 2019 - 2024. All rights reserved.