为什么lisp函数会评估错误的参数?

时间:2015-11-07 00:02:21

标签: lisp common-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]

但我有funcall cdr,而非1

我正在使用免费版的Franz的Allegro Lisp。

1 个答案:

答案 0 :(得分:6)

Lisp中的函数调用语法是:

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

表达式......

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

...被评估为&#34;在参数1cdr&#34;上调用函数'(1 2 4 5 6 7)

换句话说,你有一组额外的括号。尝试:

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

递归调用中存在同样的问题。