我定义了一个重复函数调用的函数:
(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=1
,f=cdr
和x='(1 2 3 4 5 6 7)
。它应该适用cdr
一次。这是我收到的错误消息:
Error: Funcall of 1 which is a non-function.
[condition type: TYPE-ERROR]
但我有funcall
cdr
,而非1
。
我正在使用免费版的Franz的Allegro Lisp。
答案 0 :(得分:6)
Lisp中的函数调用语法是:
(<function> <arg1> <arg2> <arg3> ...)
表达式......
(1 (function cdr) '(1 2 4 5 6 7))
...被评估为&#34;在参数1
和cdr
&#34;上调用函数'(1 2 4 5 6 7)
。
换句话说,你有一组额外的括号。尝试:
(repeat 1 (function cdr) '(1 2 4 5 6 7))
递归调用中存在同样的问题。