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

标签 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]

但是我有一个 funcallcdr,而不是 1

我使用的是 Franz 的 Allegro Lisp 免费版。

最佳答案

Lisp 中的函数调用语法是:

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

所以表达式...

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

... 被评估为“在参数 cdr'(1 2 4 5 6 7) 上调用函数 1” .

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

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

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

关于lisp - 为什么 lisp 函数评估错误的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33577490/

相关文章:

lisp - 函数的意外结果(递归)

lisp - 禁用 lispworks capi :push-button-panel 上的单个按钮

lisp - Common Lisp 中的替换

common-lisp - 指示符的性质是什么?

compilation - Common Lisp 编译和加载目录

macros - Clojure 宏在调用时抛出 "CompilerException java.lang.IllegalStateException: Var clojure.core/unquote is unbound"

error-handling - 在 SBCL 中使用 [Take New] 重新启动

scala - LISP 的代码即数据意识形态与高阶函数基本相同吗?

lisp - 带有蹦床和 Y 组合器的代码应该在具有动态作用域的 lisp 中工作吗?