2015-10-13 64 views
1

下面的函数输出Hello, worldCommon Lisp的:调用一个函数A,与函数fn和A返回调用FN

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

功能A调用函数B lambda函数,传递给它helloworld功能:

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

函数B返回一个lambda函数,该函数调用传递给B的函数:

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

不幸的是,它不工作。据推测,我在功能A中做了一些不正确的事情。我怎样才能使这工作?

+1

您应该会收到'(defun A() ((B#'helloworld)))'的错误。 '((B#'helloworld))'在Common Lisp中不合法。 –

回答

3

您需要在功能上使用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

相关问题