2015-11-07 51 views
-2

我定義一個函數來完成重複的函數調用:爲什麼lisp函數會評估錯誤的參數?

(defun repeat (n f x) 
       (if (zerop n) x 
       (repeat ((- n 1) f (funcall f x))))) 

現在我想要想申請cdr

(repeat (1 (function cdr) '(1 2 4 5 6 7))) 

我清楚地供應n=1f=cdrx='(1 2 3 4 5 6 7)。它應該應用cdr一次。這是錯誤消息我得到:

Error: Funcall of 1 which is a non-function. 
[condition type: TYPE-ERROR] 

但我有一個funcallcdr,不1

我使用的是Franz Allegro Lisp的免費版本。在Lisp中

+1

不要編輯問題來添加答案,它已經在答案中。如果您需要顯示與接受的答案不同的答案,請發佈您自己的答案。 – Barmar

回答

6

函數調用的語法是:

(<function> <arg1> <arg2> <arg3> ...) 

所以表達式...

(1 (function cdr) '(1 2 4 5 6 7)) 

...被評爲 「調用函數1上的參數cdr'(1 2 4 5 6 7)」。

換句話說,你有一套額外的括號。請嘗試:

(repeat 1 (function cdr) '(1 2 4 5 6 7)) 

您的遞歸調用中存在同樣的問題。

相關問題