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

0

aref関数nthまたはelt配列内の要素にアクセスできるという点で似ています (後者の 2 つはリストで機能します)。

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は2つの添え字があるため、それは多次元配列、配列内の配列です。

ハイパースペックオンaref

于 2013-04-27T08:45:57.643 に答える