2015-10-16 28 views
0

以下helloworld函數簡單地輸出你好,世界Common Lisp的:函數A傳遞到B中的功能它傳遞至C這調用函數

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

我創建的傳遞helloworld起作用B函數A

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

功能B然後轉到函數C的函數:

(defun B (fn) 
    (C#'fn)) 

功能C然後調用函數(即,它調用helloworld):

(defun C (fn) 
    (funcall fn)) 

當我運行程序:

(A) 

我收到此錯誤信息:

Error in FUNCTION [or a callee]: The function FN is undefined. 

爲什麼?

我該如何解決?

回答

3

啊,我剛剛發現我的方式錯誤。

功能A被傳遞helloworld功能B

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

所以B具有功能等B有沒有必要使用#'(或function)至得到功能。因此,B只需要功能傳遞給C

(defun B (fn) 
    (C fn)) 

同樣,C 功能,所以只需要調用該函數:

(defun C (fn) 
    (funcall fn)) 

田田!這樣可行!

+0

你可能應該接受其中一個答案(無論是你的還是其他答案)。 –

7
(C#'fn) 

這看起來一個名爲fnlabels函數之類的東西defun創建,flet等你,所以你應該只將其轉發到C而非仰視它的名字包含一個函數的變量,:

(defun B (fn) 
    (C fn)) 
;  ^^ no #' 

Live Demo

+1

ideone似乎使用Flash。確保您已經卸載Flash。 Flash存在持續的安全問題,而且現在已知一個未修補的安全問題:http://arstechnica.com/security/2015/10/new-zero-day-exploit-hits-fully-patched-adobe-flash/ –