Common Lisp:用函数fn调用函数A,A返回调用fn的lambda函数

时间:2015-10-13 21:08:20

标签: lisp common-lisp

以下功能输出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中做了一些不正确的事情。我该如何让它工作?

2 个答案:

答案 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