为什么我得到一个"应该是一个lambda表达"此代码出错?

时间:2018-02-02 23:38:27

标签: lambda common-lisp clisp

我正在尝试在CLISP中创建自己的mapcar函数,而不使用mapcar。每次运行我的代码时,都会收到一条错误,说“#34; ...应该是一个lambda表达式。"我无法弄清楚为什么我会收到此错误。这是我试图运行的代码:

(defun my-map (f list)
   (if (not(NULL list))
      ((funcall f (car(list)))
        my-map (f (cdr(list))))))

如果有人可以告诉我为什么会收到此错误,如果您发现任何其他错误,我将不胜感激。我是CLISP的初学者。

2 个答案:

答案 0 :(得分:1)

Common Lisp函数调用如下所示:

(operator operands ...)

与Scheme CL不同的是lisp2,这意味着运算符需要是标识符或lambda表单。没有别的东西是允许的。在您的代码中:

; <- operator ----------> <-- operands ... -->
((funcall f (car (list))) my-map (f (cdr (list))))

所以你有它。 (funcall f (car (list)))不是标识符或lambda表单。

通常如果你正在制作一个map,你会cons调用第一个元素上的函数的结果,并带有与列表其余部分的递归。

答案 1 :(得分:1)

你不能通过在括号内放一个括号来制作你的返回清单;解释器认为你正在进行函数调用,这就是为什么它试图将该表达式解释为函数。相反,您需要一个函数,该函数返回一个列表,其结果是将f调用到您通过递归调用获得的列表的头部。