LISP - Diziler

LISP, tek veya çok boyutlu dizileri kullanarak make-arrayişlevi. Bir dizi, herhangi bir LISP nesnesini kendi elemanları olarak saklayabilir.

Tüm diziler bitişik bellek konumlarından oluşur. En düşük adres ilk öğeye ve en yüksek adres son öğeye karşılık gelir.

Bir dizinin boyutlarının sayısına sıralaması denir.

LISP'de, bir dizi öğesi, negatif olmayan bir tamsayı dizini dizisi tarafından belirtilir. Dizinin uzunluğu, dizinin derecesine eşit olmalıdır. Endeksleme sıfırdan başlar.

Örneğin, dizim adında 10 hücreli bir dizi oluşturmak için şunu yazabiliriz -

(setf my-array (make-array '(10)))

Aref işlevi, hücrelerin içeriğine erişime izin verir. Dizinin adı ve dizin değeri olmak üzere iki bağımsız değişken alır.

Örneğin, onuncu hücrenin içeriğine erişmek için şunu yazıyoruz -

(aref my-array 9)

örnek 1

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

(write (setf my-array (make-array '(10))))
(terpri)
(setf (aref my-array 0) 25)
(setf (aref my-array 1) 23)
(setf (aref my-array 2) 45)
(setf (aref my-array 3) 10)
(setf (aref my-array 4) 20)
(setf (aref my-array 5) 17)
(setf (aref my-array 6) 25)
(setf (aref my-array 7) 19)
(setf (aref my-array 8) 67)
(setf (aref my-array 9) 30)
(write my-array)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
#(25 23 45 10 20 17 25 19 67 30)

Örnek 2

3'e 3 bir dizi oluşturalım.

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

(setf x (make-array '(3 3) 
   :initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))
)
(write x)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

#2A((0 1 2) (3 4 5) (6 7 8))

Örnek 3

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

(setq a (make-array '(4 3)))
(dotimes (i 4)
   (dotimes (j 3)
      (setf (aref a i j) (list i 'x j '= (* i j)))
   )
)
(dotimes (i 4)
   (dotimes (j 3)
      (print (aref a i j))
   )
)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

(0 X 0 = 0) 
(0 X 1 = 0) 
(0 X 2 = 0) 
(1 X 0 = 0) 
(1 X 1 = 1) 
(1 X 2 = 2) 
(2 X 0 = 0) 
(2 X 1 = 2) 
(2 X 2 = 4) 
(3 X 0 = 0) 
(3 X 1 = 3) 
(3 X 2 = 6)

Make-array işlevi için tam sözdizimi

Make-array işlevi başka birçok argüman alır. Bu işlevin tam sözdizimine bakalım -

make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer  :displaced-to :displaced-index-offset

Boyutlar bağımsız değişkeninin dışında , diğer tüm bağımsız değişkenler anahtar sözcüklerdir. Aşağıdaki tablo, argümanların kısa açıklamasını sağlar.

Sr.No. Argüman ve Açıklama
1

dimensions

Dizinin boyutlarını verir. Tek boyutlu dizi için bir sayı ve çok boyutlu dizi için bir listedir.

2

:element-type

Tür belirleyicidir, varsayılan değer T'dir, yani herhangi bir tür

3

:initial-element

İlk elemanların değeri. Tüm elemanların belirli bir değerle başlatıldığı bir dizi oluşturacaktır.

4

:initial-content

Nesne olarak ilk içerik.

5

:adjustable

Temel belleği yeniden boyutlandırılabilen yeniden boyutlandırılabilir (veya ayarlanabilir) bir vektör oluşturmaya yardımcı olur. Argüman, dizinin ayarlanabilir olup olmadığını gösteren bir Boole değeridir, varsayılan değer NIL'dir.

6

:fill-pointer

Yeniden boyutlandırılabilir bir vektörde gerçekte depolanan öğelerin sayısını izler.

7

:displaced-to

İçeriğini belirtilen diziyle paylaşan yer değiştirmiş bir dizi veya paylaşılan dizi oluşturmaya yardımcı olur. Her iki dizi de aynı eleman türüne sahip olmalıdır. : Displaced-to seçeneği: initial-element veya: initial-content seçeneğiyle kullanılamaz. Bu bağımsız değişken varsayılan olarak sıfırdır.

8

:displaced-index-offset

Oluşturulan paylaşılan dizinin indeks ofsetini verir.

Örnek 4

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

(setq myarray (make-array '(3 2 3) 
   :initial-contents 
   '(((a b c) (1 2 3)) 
      ((d e f) (4 5 6)) 
      ((g h i) (7 8 9)) 
   ))
) 
(setq array2 (make-array 4 :displaced-to myarray :displaced-index-offset 2)) 
(write myarray)
(terpri)
(write array2)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#(C 1 2 3)

Yer değiştiren dizi iki boyutlu ise -

(setq myarray (make-array '(3 2 3) 
   :initial-contents 
   '(((a b c) (1 2 3)) 
      ((d e f) (4 5 6)) 
      ((g h i) (7 8 9)) 
   ))
) 
(setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 2)) 
(write myarray)
(terpri)
(write array2)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((C 1) (2 3) (D E))

Yer değiştirmiş indeks ofsetini 5 olarak değiştirelim -

(setq myarray (make-array '(3 2 3) 
   :initial-contents 
   '(((a b c) (1 2 3)) 
      ((d e f) (4 5 6)) 
      ((g h i) (7 8 9)) 
   ))
) 
(setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 5)) 
(write myarray)
(terpri)
(write array2)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((3 D) (E F) (4 5))

Örnek 5

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

;a one dimensional array with 5 elements, 
;initail value 5
(write (make-array 5 :initial-element 5))
(terpri)

;two dimensional array, with initial element a
(write (make-array '(2 3) :initial-element 'a))
(terpri)

;an array of capacity 14, but fill pointer 5, is 5
(write(length (make-array 14 :fill-pointer 5)))
(terpri)

;however its length is 14
(write (array-dimensions (make-array 14 :fill-pointer 5)))
(terpri)

; a bit array with all initial elements set to 1
(write(make-array 10 :element-type 'bit :initial-element 1))
(terpri)

; a character array with all initial elements set to a
; is a string actually
(write(make-array 10 :element-type 'character :initial-element #\a)) 
(terpri)

; a two dimensional array with initial values a
(setq myarray (make-array '(2 2) :initial-element 'a :adjustable t))
(write myarray)
(terpri)

;readjusting the array
(adjust-array myarray '(1 3) :initial-element 'b) 
(write myarray)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

#(5 5 5 5 5)
#2A((A A A) (A A A))
5
(14)
#*1111111111
"aaaaaaaaaa"
#2A((A A) (A A))
#2A((A A B))