Lambda 请为我解释一下这个常见的Lisp代码中正在做什么。。。。?

Lambda 请为我解释一下这个常见的Lisp代码中正在做什么。。。。?,lambda,common-lisp,Lambda,Common Lisp,我得到了所有其余的代码,因此如果您能解释以下函数的这一部分,我将不胜感激: (mapcar (lambda (x y) (aref cells y x)) (list l x r l r l x r) (list u u u y y d d d)) 也就是说,我得到了mapcar至少在这个不相关的声明中它在做什么: (mapcar #'car '((1 a) (2 b) (3 c))) 而且我知道lambda是一个泛型(defun) 以下是

我得到了所有其余的代码,因此如果您能解释以下函数的这一部分,我将不胜感激:

(mapcar (lambda (x y)
          (aref cells y x))
        (list l x r l r l x r)
        (list u u u y y d d d))
也就是说,我得到了
mapcar
至少在这个不相关的声明中它在做什么:

(mapcar #'car '((1 a) (2 b) (3 c)))
而且我知道
lambda
是一个泛型(defun)

以下是上述代码部分的功能:

(defun neighbours (cells x y)
  (let* ((mx (1- (array-dimension cells 1)))
         (my (1- (array-dimension cells 0)))
         (l (if (zerop x) mx (1- x)))
         (r (if (= x mx) 0 (1+ x)))
         (u (if (zerop y) my (1- y)))
         (d (if (= y my) 0 (1+ y))))
    (mapcar (lambda (x y)
              (aref cells y x))
            (list l x r l r l x r)
            (list u u u y y d d d))))

使用检索数组的元素。调用
(aref cells y x)
从二维数组
cells
返回位置(y,x)处的元素。将函数应用于根据传递给它的序列构造的参数列表,并返回函数返回值的列表。所以

(mapcar (lambda (x y)
          (aref cells y x))
        (list l x r l r l x r)
        (list u u u y y d d d))
返回使用
lu
、使用
xu
ru
等调用lambda函数的结果列表。结果相当于

(list (aref cells u l)
      (aref cells u x)
      (aref cells u r)
      ...
      (aref cells d x)
      (aref cells d r))

aref
与函数
nth
elt
类似,它允许您访问数组中的元素(后两个用于列表)

它也适用于多维阵列:

CL-USER> (setf test (make-array '(2 3) :initial-contents '((1 2 3) (4 5 6))))
#2A((1 2 3) (4 5 6))
CL-USER> test
#2A((1 2 3) (4 5 6))
CL-USER> (aref test 0 1)
2
CL-USER> (aref test 0 2)
3
CL-USER> (aref test 1 0)
4
CL-USER> (aref test 1 1)
5
CL-USER> 
在您的例子中,因为对
array
的调用有两个下标,所以它是一个多维数组,数组中的数组

在aref上

实际上我认为应该是(aref cells u l)(aref cells u x)等等。。。lambda将值绑定到x和y,但aref调用的是y和x,因此是相反的。
CL-USER> (setf test (make-array '(2 3) :initial-contents '((1 2 3) (4 5 6))))
#2A((1 2 3) (4 5 6))
CL-USER> test
#2A((1 2 3) (4 5 6))
CL-USER> (aref test 0 1)
2
CL-USER> (aref test 0 2)
3
CL-USER> (aref test 1 0)
4
CL-USER> (aref test 1 1)
5
CL-USER>