为什么我会得到一个“a”;应为lambda表达式;这个代码有错误吗?

为什么我会得到一个“a”;应为lambda表达式;这个代码有错误吗?,lambda,common-lisp,clisp,Lambda,Common Lisp,Clisp,我正在尝试在CLISP中创建自己的mapcar函数,而不使用mapcar。每次运行代码时,我都会收到一个错误,上面写着“…应该是lambda表达式。”我无法理解为什么会出现这个错误。以下是我尝试运行的代码: (defun my-map (f list) (if (not(NULL list)) ((funcall f (car(list))) my-map (f (cdr(list)))))) 如果有人能告诉我为什么会出现这个错误,如果您看到任何其他错误,我将

我正在尝试在CLISP中创建自己的mapcar函数,而不使用mapcar。每次运行代码时,我都会收到一个错误,上面写着“…应该是lambda表达式。”我无法理解为什么会出现这个错误。以下是我尝试运行的代码:

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

如果有人能告诉我为什么会出现这个错误,如果您看到任何其他错误,我将不胜感激。我是CLISP的初学者。

通用Lisp函数调用如下所示:

(operator operands ...)
与Scheme不同,CL是一个lisp2,这意味着操作符需要是一个标识符或lambda表单。除此之外,不允许任何其他行为。在代码中:

; <- operator ----------> <-- operands ... -->
((funcall f (car (list))) my-map (f (cdr (list))))
;
((funcall f(car(list)))我的地图(f(cdr(list)))
好了<代码>(funcall f(car(list))不是标识符或lambda表单


通常,如果您正在制作一个
映射
,您将
cons
调用第一个元素上的函数的结果,并与列表的其余部分递归。

公共Lisp函数调用如下所示:

(operator operands ...)
与Scheme不同,CL是一个lisp2,这意味着操作符需要是一个标识符或lambda表单。除此之外,不允许任何其他行为。在代码中:

; <- operator ----------> <-- operands ... -->
((funcall f (car (list))) my-map (f (cdr (list))))
;
((funcall f(car(list)))我的地图(f(cdr(list)))
好了<代码>(funcall f(car(list))不是标识符或lambda表单


通常,如果您正在制作一个
映射
,您将
cons
调用第一个元素上的函数的结果,并与列表的其余部分进行递归。

您不能通过在返回列表前面加一个括号来创建返回列表;解释器认为您正在进行函数调用,这就是它试图将该表达式解释为函数的原因。相反,您需要一个函数,该函数返回一个列表,该列表的结果是调用递归调用得到的列表头上的
f
;解释器认为您正在进行函数调用,这就是它试图将该表达式解释为函数的原因。相反,您需要一个函数来返回一个列表,该列表的结果是调用递归调用得到的列表头上的
f

错误是否涉及代码中的任何特定内容?你能解释一下你认为这应该是如何工作的吗?那么f是你想要使用的函数名,list是你要传递给它的数字列表。我的想法是,如果列表不是null(它仍然有值),那么可以对列表的第一个元素执行函数调用f。然后对列表的其余部分执行递归调用。当我尝试加载它时,我得到的错误是“(FUNCALL F(CAR(LIST)))应该是一个lambda表达式”。可能重复的错误是否涉及代码中的任何特定内容?你能解释一下你认为这应该是如何工作的吗?那么f是你想要使用的函数名,list是你要传递给它的数字列表。我的想法是,如果列表不是null(它仍然有值),那么可以对列表的第一个元素执行函数调用f。然后对列表的其余部分执行递归调用。当我尝试加载它时,我得到的错误是“(FUNCALL F(CAR(LIST)))应该是一个lambda表达式”。可能重复如何更改代码以使其正常工作?我还是不明白。@Jonathan
(我的地图1+)(1 2 3))
应该变成
(cons(funcall#'1+1)(我的地图1+)(2 3))
,这样结果就变成了
(2 3 4)
。我很感谢你的帮助,但现在它告诉我(cons(funcall f(car(list))(我的地图f(cdr(list))))应该是一个lambda表达式。@Jonathane:您的表达式周围可能有一组额外的括号。@Jonathane每次您得到“应该是一个lambda表达式”时,您又犯了完全相同的错误,正如Scott提到的,这经常是因为多余的括号。如何更改代码以使其正常工作?我还是不明白。@Jonathan
(我的地图1+)(1 2 3))
应该变成
(cons(funcall#'1+1)(我的地图1+)(2 3))
,这样结果就变成了
(2 3 4)
。我很感谢你的帮助,但现在它告诉我(cons(funcall f(car(list))(我的地图f(cdr(list))))应该是一个lambda表达式。@Jonathan:您的表达式周围可能有一组额外的括号。@Jonathane每次您得到“应该是一个lambda表达式”时,您又犯了完全相同的错误,正如Scott提到的,这通常是因为括号过多。