以下功能输出Hello, world
(defun helloworld ()
(format t "Hello, world"))
函数A
调用函数B
,并将helloworld
函数传递给它:
(defun A ()
((B #'helloworld)))
函数B
返回一个lambda函数,该函数调用传递给B
的函数:
(defun B (fn)
(#'lambda ()
(funcall fn)))
不幸的是,它不起作用。据推测,我在函数A
中做了一些不正确的事情。我该如何让它工作?
答案 0 :(得分:3)
您需要在函数A中使用funcall
,因为函数B的返回值不在函数名称空间中:
? (defun helloworld ()
(format t "Hello, world"))
HELLOWORLD
? (defun B (fn)
(lambda () (funcall fn)))
B
? (defun A ()
(funcall (B #'helloworld)))
A
? (a)
Hello, world
NIL
?
Here是关于这个主题的更多阅读。
答案 1 :(得分:1)
你似乎以错误的方式理解它。每个列表表单的第一项不会以与其他项目相同的方式进行评估。列表表单的第一个表达式必须是符号(如(+ 1 2)
)或lambda表达式(如((lambda (x y) (+ x y)) 1 2)
中所示)。这意味着,您不能使用((B #'helloworld))
之类的任何内容。相反,您应该使用从(B #'helloworld)
返回的函数对象作为参数,传递给funcall
。