Common Lisp:使用函数 fn 调用函数 A,A returns 调用 fn 的 lambda 函数

Common Lisp: call a function A with a function fn and A returns a lambda function that invokes fn

下面的函数输出Hello, world

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

函数 A 调用函数 B,将其传递给 helloworld 函数:

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

函数 B returns 一个 lambda 函数,它调用传递给 B 的函数:

(defun B (fn)
    (#'lambda () 
        (funcall fn)))

不幸的是,它不起作用。大概我在函数 A 中做错了什么。请问我该如何让它工作?

您需要在函数 A 中使用 funcall,因为函数 B 的 return 值不在函数命名空间中:

? (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 2))或 lambda 表达式(如 ((lambda (x y) (+ x y)) 1 2))。这意味着,您不能使用 ((B #'helloworld)) 之类的东西。相反,您应该使用从 (B #'helloworld) 返回的函数对象作为参数传递给 funcall.