【问题标题】:write acces to function slot (other than defun) [duplicate]对函数槽的写访问(除了定义)[重复]
【发布时间】:2016-12-05 21:24:38
【问题描述】:

defun 宏在符号的函数 slot 中“存储”了一个函数 object,例如:

(defun f () "Hello.")
打印“Hello”的函数现在存储在符号f的函数槽中。
(可以通过#'f检索。)

是否有另一种方法(defun 除外)在符号的函数槽中写入/“存储”函数对象?

因为像 (setf minus #'-) 这样的东西只会将函数对象存储在符号 minusvalue 槽中。

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

    还有其他方式(除了defun)在符号的函数槽中写入/“存储”函数对象吗?

    你可以使用symbol-function:

    (setf (symbol-function 'f) (lambda () "Bye."))
    (f)  ; => "Bye."
    (defun g () "Hello again.")
    (setf (symbol-function 'f) (symbol-function 'g))
    (f)  ; => "Hello again."
    

    另一种可能是使用fdefinition:

    (setf (fdefinition 'f) (lambda () "Bye again.")
    (f)  ; => "By again"
    

    它们几乎是等价的。主要区别在于symbol-function 需要一个必须是符号的参数,而fdefinition 接受一个函数名,它也可以是一个列表(参见glossary)。

    【讨论】:

    • 还有fdefinition
    • @Renzo @sds 谢谢!我一直认为symbol-function 只是某种吸气剂。但根据您的示例,它也可以用作设置器中的位置。将查看有关 symbol-value 的 HyperSpec。再次感谢。
    • 请注意,这只适用于顶级(全局)绑定。它将忽略在函数命名空间中创建的带有fletlabels 的词法绑定
    猜你喜欢
    • 2021-06-25
    • 2019-07-08
    • 2012-10-21
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多