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
.
下面的函数输出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
.