我正在尝试在CLISP中创建自己的mapcar函数,而不使用mapcar。每次运行我的代码时,都会收到一条错误,说“#34; ...应该是一个lambda表达式。"我无法弄清楚为什么我会收到此错误。这是我试图运行的代码:
(defun my-map (f list)
(if (not(NULL list))
((funcall f (car(list)))
my-map (f (cdr(list))))))
如果有人可以告诉我为什么会收到此错误,如果您发现任何其他错误,我将不胜感激。我是CLISP的初学者。
答案 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
调用到您通过递归调用获得的列表的头部。