Common lisp 什么';在CL中,F定义和函数(特殊运算符)之间的区别是什么?

Common lisp 什么';在CL中,F定义和函数(特殊运算符)之间的区别是什么?,common-lisp,Common Lisp,所以我正在阅读quicklisp代码,试图理解它并从中学习。 我看过这个宏: (defmacro neuter-package (name) `(eval-when (:compile-toplevel :load-toplevel :execute) (let ((definition (fdefinition 'error-unimplemented))) (do-external-symbols (symbol ,(string name

所以我正在阅读quicklisp代码,试图理解它并从中学习。 我看过这个宏:

(defmacro neuter-package (name)
      `(eval-when (:compile-toplevel :load-toplevel :execute)
         (let ((definition (fdefinition 'error-unimplemented)))
           (do-external-symbols (symbol ,(string name))
             (unless (fboundp symbol)
               (setf (fdefinition symbol) definition))))))
据我所知,fdefinition和function(#')之间的唯一区别在于fdefinition是可设置的。我说得对吗? 如果是,省略let部分并将setf更改为

(setf (fdefinition symbol) #'error-unimplemented)

FDEFINITION
是一个函数<代码>功能是一个特殊的运算符
FDEFINITION
因此获得一个经过计算的参数

(setf (fdefinition symbol) #'error-unimplemented)
上面的意思是将全局函数定义设置为函数
ERROR-UNIMPLEMENTED
。它也可以是具有该名称的词法绑定函数

(flet ((error-unimplemented (...) ...))
  (neuter-package "FOO"))
上面将使用词汇绑定函数

还请注意,在某些情况下,Lisp编译器可能会假定使用了特定的当前函数
ERROR-UNIMPLEMENTED
。例如,用于内联或不带查找的调用

但代码使用
FDEFINITION

(setf (fdefinition symbol) (fdefinition 'error-unimplemented))
上面将在运行时从符号中查找全局函数

(flet ((error-unimplemented (...) ...))
  (neuter-package "FOO"))

上面不会使用词汇绑定函数。

我认为您的
setf
两种形式都具有相同的效果。也许您可以修改您的答案以包含更多自包含的示例?@sds:FDEFINITION将始终查找全局定义<代码>函数可以引用词汇绑定的版本。。。