2013-04-26 4 views
0

я получаю всю остальную часть кода, так что я был бы очень признателен, если бы вы объяснить этот раздел следующей функции:Пожалуйста, объясните мне, что делается в этом общем коде 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)

Вот функция выше раздел коды пришел:

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

ответ

1

Элементы массива извлекаются с использованием aref. Вызов (aref cells y x) возвращает элемент в позиции (y, x) из двухмерного массива cells. 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, и так далее. Результат эквивалентен

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

на самом деле я думаю, что это будет (Ареф клетки мкл) (Ареф клетки УБ) и так далее ... лямбда связывает значения х и у, но Ареф звонит у и х, так наоборот. – momo

+0

Хороший улов! Я обновил ответ. –

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 имеет два индекса, это многомерный массив, массивы внутри массивов.

Hyperspec на aref

Смежные вопросы