LISP - Array
LISP memungkinkan Anda untuk menentukan array satu atau beberapa dimensi menggunakan make-arrayfungsi. Sebuah array dapat menyimpan objek LISP apapun sebagai elemennya.
Semua array terdiri dari lokasi memori yang berdekatan. Alamat terendah sesuai dengan elemen pertama dan alamat tertinggi untuk elemen terakhir.
Jumlah dimensi dari sebuah array disebut ranknya.
Dalam LISP, elemen array ditentukan oleh urutan indeks bilangan bulat non-negatif. Panjang urutan harus sama dengan pangkat array. Pengindeksan dimulai dari nol.
Misalnya, untuk membuat array dengan 10- sel, bernama my-array, kita dapat menulis -
(setf my-array (make-array '(10)))
Fungsi aref memungkinkan mengakses konten sel. Dibutuhkan dua argumen, nama array dan nilai indeks.
Misalnya, untuk mengakses konten sel kesepuluh, kami menulis -
(aref my-array 9)
Contoh 1
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(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)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
#(25 23 45 10 20 17 25 19 67 30)
Contoh 2
Mari kita buat array 3-kali-3.
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(setf x (make-array '(3 3)
:initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))
)
(write x)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
#2A((0 1 2) (3 4 5) (6 7 8))
Contoh 3
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(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))
)
)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
(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)
Sintaks Lengkap untuk Fungsi make-array
Fungsi make-array mengambil banyak argumen lain. Mari kita lihat sintaks lengkap dari fungsi ini -
make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer :displaced-to :displaced-index-offset
Terlepas dari argumen dimensi , semua argumen lainnya adalah kata kunci. Tabel berikut memberikan penjelasan singkat tentang argumen.
Sr.No. | Argumen & Deskripsi |
---|---|
1 | dimensions Ini memberikan dimensi array. Ini adalah angka untuk larik satu dimensi, dan daftar untuk larik multidimensi. |
2 | :element-type Ini adalah penentu tipe, nilai defaultnya adalah T, yaitu tipe apa saja |
3 | :initial-element Nilai elemen awal. Ini akan membuat array dengan semua elemen diinisialisasi ke nilai tertentu. |
4 | :initial-content Konten awal sebagai objek. |
5 | :adjustable Ini membantu dalam membuat vektor yang dapat diubah ukurannya (atau dapat disesuaikan) yang memori dasarnya dapat diubah ukurannya. Argumennya adalah nilai Boolean yang menunjukkan apakah array dapat disesuaikan atau tidak, nilai defaultnya adalah NIL. |
6 | :fill-pointer Ini melacak jumlah elemen yang sebenarnya disimpan dalam vektor yang dapat diubah ukurannya. |
7 | :displaced-to Ini membantu dalam membuat larik yang dipindahkan atau larik bersama yang membagikan isinya dengan larik yang ditentukan. Kedua array harus memiliki tipe elemen yang sama. Opsi: displaced-to tidak boleh digunakan dengan opsi: initial-element atau: opsi-isi awal. Argumen ini defaultnya nol. |
8 | :displaced-index-offset Ini memberikan indeks-offset dari array bersama yang dibuat. |
Contoh 4
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(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)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#(C 1 2 3)
Jika array yang dipindahkan adalah dua dimensi -
(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)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
#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))
Mari kita ubah offset indeks yang dipindahkan menjadi 5 -
(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)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
#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))
Contoh 5
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
;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)
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
#(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))