LISP - อาร์เรย์
LISP ช่วยให้คุณกำหนดอาร์เรย์มิติเดียวหรือหลายมิติโดยใช้ make-arrayฟังก์ชัน อาร์เรย์สามารถจัดเก็บออบเจ็กต์ LISP เป็นองค์ประกอบได้
อาร์เรย์ทั้งหมดประกอบด้วยตำแหน่งหน่วยความจำที่อยู่ติดกัน ที่อยู่ต่ำสุดสอดคล้องกับองค์ประกอบแรกและที่อยู่สูงสุดขององค์ประกอบสุดท้าย
จำนวนมิติของอาร์เรย์เรียกว่าอันดับ
ใน LISP องค์ประกอบอาร์เรย์ถูกระบุโดยลำดับของดัชนีจำนวนเต็มที่ไม่เป็นลบ ความยาวของลำดับต้องเท่ากับอันดับของอาร์เรย์ การจัดทำดัชนีเริ่มจากศูนย์
ตัวอย่างเช่นในการสร้างอาร์เรย์ที่มี 10 เซลล์ชื่อ my-array เราสามารถเขียน -
(setf my-array (make-array '(10)))
ฟังก์ชัน aref อนุญาตให้เข้าถึงเนื้อหาของเซลล์ ต้องใช้สองอาร์กิวเมนต์ชื่อของอาร์เรย์และค่าดัชนี
ตัวอย่างเช่นในการเข้าถึงเนื้อหาของเซลล์ที่สิบเราเขียน -
(aref my-array 9)
ตัวอย่าง 1
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(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)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
#(25 23 45 10 20 17 25 19 67 30)
ตัวอย่าง 2
ให้เราสร้างอาร์เรย์ 3 คูณ 3
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(setf x (make-array '(3 3)
:initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))
)
(write x)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
#2A((0 1 2) (3 4 5) (6 7 8))
ตัวอย่างที่ 3
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(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))
)
)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
(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 รับอาร์กิวเมนต์อื่น ๆ มากมาย ให้เราดูไวยากรณ์ทั้งหมดของฟังก์ชันนี้ -
make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer :displaced-to :displaced-index-offset
นอกเหนือจากอาร์กิวเมนต์มิติแล้วอาร์กิวเมนต์อื่น ๆ ทั้งหมดคือคีย์เวิร์ด ตารางต่อไปนี้ให้คำอธิบายสั้น ๆ ของอาร์กิวเมนต์
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | dimensions มันให้ขนาดของอาร์เรย์ เป็นตัวเลขสำหรับอาร์เรย์หนึ่งมิติและรายการสำหรับอาร์เรย์หลายมิติ |
2 | :element-type เป็นตัวระบุชนิดค่าเริ่มต้นคือ T เช่นประเภทใดก็ได้ |
3 | :initial-element ค่าองค์ประกอบเริ่มต้น มันจะสร้างอาร์เรย์ที่มีองค์ประกอบทั้งหมดเริ่มต้นเป็นค่าเฉพาะ |
4 | :initial-content เนื้อหาเริ่มต้นเป็นวัตถุ |
5 | :adjustable ช่วยในการสร้างเวกเตอร์ที่ปรับขนาดได้ (หรือปรับขนาดได้) ซึ่งหน่วยความจำพื้นฐานสามารถปรับขนาดได้ อาร์กิวเมนต์เป็นค่าบูลีนที่ระบุว่าอาร์เรย์สามารถปรับได้หรือไม่ค่าเริ่มต้นคือ NIL |
6 | :fill-pointer มันติดตามจำนวนองค์ประกอบที่เก็บไว้ในเวกเตอร์ที่ปรับขนาดได้จริง |
7 | :displaced-to ช่วยในการสร้างอาร์เรย์ที่ถูกแทนที่หรืออาร์เรย์ที่ใช้ร่วมกันซึ่งแชร์เนื้อหากับอาร์เรย์ที่ระบุ อาร์เรย์ทั้งสองควรมีประเภทองค์ประกอบเดียวกัน ไม่สามารถใช้อ็อพชัน: displaced-to กับอ็อพชัน: initial-element หรือ: initial-contents อาร์กิวเมนต์นี้มีค่าเริ่มต้นเป็นศูนย์ |
8 | :displaced-index-offset ให้ดัชนีชดเชยของอาร์เรย์ที่ใช้ร่วมกันที่สร้างขึ้น |
ตัวอย่างที่ 4
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(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)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#(C 1 2 3)
หากอาร์เรย์ที่ถูกแทนที่เป็นสองมิติ -
(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)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
#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))
ลองเปลี่ยนออฟเซ็ตดัชนีแทนที่เป็น 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)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
#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))
ตัวอย่างที่ 5
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
;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)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
#(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))