Mapcar和Lambda,LISP中未声明的变量错误

Mapcar和Lambda,LISP中未声明的变量错误,lambda,common-lisp,Lambda,Common Lisp,我正在努力掌握在LISP中使用mapcar和lambda的诀窍。下面,我有一行不工作的代码,我正在尝试使用它们。我得到一个错误,c是一个未声明的自由变量 我哪里做错了?下面是失败的代码行。然后,我的第二块代码是工作代码,尽管它比较笨重 (mapcar #'(lambda (c) (member *opponent* (nth c board))) c) (list (find-empty-position board *corners*) "Squeeze Play! 3rd m

我正在努力掌握在LISP中使用mapcar和lambda的诀窍。下面,我有一行不工作的代码,我正在尝试使用它们。我得到一个错误,c是一个未声明的自由变量

我哪里做错了?下面是失败的代码行。然后,我的第二块代码是工作代码,尽管它比较笨重

(mapcar #'(lambda (c) (member *opponent* (nth c board))) c)

(list (find-empty-position board *corners*)
      "Squeeze Play!  3rd move.")
工作代码:

 (member *opponent*
 (list
  (nth (first *corners*) board)
  (nth (second *corners*) board)
  (nth (third *corners*) board)
  (nth (fourth *corners*) board)))

(list (find-empty-position board *corners*)
      "Squeeze Play!  3rd move.")

要使用
mapcar
您必须有一个要映射的列表。看起来您想要迭代
*角点*
的元素

(mapcar #'(lambda (c) (member *opponent* (nth c board)))
        *corners*)
但是,为了与第二个代码等效,您不应该在循环内调用
member
,应该在映射的结果上调用它:

(member *opponent*
        (mapcar #'(lambda (c) (nth c board)) *corners*))

要使用
mapcar
您必须有一个要映射的列表。看起来您想要迭代
*角点*
的元素

(mapcar #'(lambda (c) (member *opponent* (nth c board)))
        *corners*)
但是,为了与第二个代码等效,您不应该在循环内调用
member
,应该在映射的结果上调用它:

(member *opponent*
        (mapcar #'(lambda (c) (nth c board)) *corners*))

第一个表达式是映射
c
的元素。
c
的值是多少?不清楚您在这里想做什么。第一个代码多次调用
成员
,每次调用
板的不同元素
。第二个代码调用它一次,在一个包含
board
不同元素的列表中。我一直在盯着我的代码,但不知怎么的我错过了。那么这应该像第二个代码块一样工作吗?(mapcar#’(lambda(c)(相等对手(第n个c板)))编号
成员
返回从第一个匹配元素开始的列表
mapcar
返回一个包含所有函数调用结果的列表,因此它将返回类似
(nil t nil t)
的内容。第一个表达式是映射
c
的元素。
c
的值是多少?不清楚您在这里想做什么。第一个代码多次调用
成员
,每次调用
板的不同元素
。第二个代码调用它一次,在一个包含
board
不同元素的列表中。我一直在盯着我的代码,但不知怎么的我错过了。那么这应该像第二个代码块一样工作吗?(mapcar#’(lambda(c)(相等对手(第n个c板)))编号
成员
返回从第一个匹配元素开始的列表
mapcar
返回一个包含所有函数调用结果的列表,因此它将返回类似于
(nil t nil t)
的内容。