我得到了所有剩下的代码,所以如果您解释以下函数的这一部分,我将非常感激:
(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))))
答案 0 :(得分:1)
使用aref
检索数组的元素。调用(aref cells y x)
从二维数组cells
返回位置(y,x)处的元素。 mapcar
将函数应用于从传递给它的序列构造的参数列表,并返回函数返回值的列表。所以,
(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
,r u
调用lambda函数的结果列表,依此类推。结果相当于
(list (aref cells u l)
(aref cells u x)
(aref cells u r)
...
(aref cells d x)
(aref cells d r))
答案 1 :(得分: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
上的