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

时间:2015-10-16 14:54:15

标签: lisp common-lisp

以下helloworld函数只输出Hello,world

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

我创建了一个将A传递给函数helloworld的函数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.

为什么?

我该如何解决?

2 个答案:

答案 0 :(得分:7)

(C #'fn)

这会查找使用fndefunlabels等内容创建的名为flet的函数。您有一个包含函数的变量,所以您应该只是将其转发到C而不是查找其名称:

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

Live Demo

答案 1 :(得分:3)

啊,我刚刚发现了我的错误。

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

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

因此B 该功能,因此B无需使用#'(或function获取< / em>这个功能。因此,B只需将函数传递给C

(defun B (fn)
    (C fn))

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

(defun C (fn)
    (funcall fn))

TADA!那很有效!