0

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

(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))))
4

2 回答 2

1

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

(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))

l u返回使用、x u、等调用 lambda 函数的结果列表r u。结果等价于

(list (aref cells u l)
      (aref cells u x)
      (aref cells u r)
      ...
      (aref cells d x)
      (aref cells d r))
于 2013-04-26T17:01:25.940 回答
0

aref类似于该函数nth,或者elt它允许您访问数组中的元素(后两者适用于列表)。

CL-USER> (setf test (make-array 3 :initial-contents '(1 2 3)))   
#(1 2 3)
CL-USER> test
#(1 2 3)
CL-USER> (aref test 0)
1
CL-USER> (aref test 1)
2

它也适用于多维数组:

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

于 2013-04-27T08:45:57.643 回答