Common Lisp:函数 A 将函数传递给 B,B 将其传递给调用函数的 C

Common Lisp: function A passes a function to B which passes it to C which invokes the function

下面的helloworld函数简单的输出了Hello, world

(defun helloworld ()
    (format t "Hello, world"))

我创建了一个函数 Ahelloworld 传递给函数 B:

(defun A ()
    (B #'helloworld))

函数B然后将函数传递给函数C:

(defun B (fn)
    (C #'fn))

函数 C 然后调用函数(即它调用 helloworld):

(defun C (fn)
    (funcall fn))

当我运行程序:

(A)

我收到此错误消息:

Error in FUNCTION [or a callee]: The function FN is undefined.

为什么?

我该如何解决?

(C #'fn)

这将查找一个名为 fn 的函数,该函数由 defunlabelsflet 等创建。您有一个包含函数的变量,因此您应该将它转发到 C 而不是查找它的名称:

(defun B (fn)
    (C fn))
;     ^^ no #'

Live Demo

啊,我才发现我方法的错误

函数 A 正在将 helloworld 函数传递给 B:

(defun A ()
    (B #'helloworld))

所以B的功能所以B不需要用#'(或function)来获取函数。因此,B 只需要将函数传递给 C:

(defun B (fn)
    (C fn))

同样,C 函数,所以它只需要调用函数:

(defun C (fn)
    (funcall fn))

塔达!行得通!