LISP - รายการ
รายการเป็นโครงสร้างข้อมูลที่สำคัญที่สุดและเป็นโครงสร้างข้อมูลหลักใน LISP แบบดั้งเดิม Common LISP ในปัจจุบันมีโครงสร้างข้อมูลอื่น ๆ เช่นเวกเตอร์ตารางแฮชคลาสหรือโครงสร้าง
รายการเป็นรายการเดียวที่เชื่อมโยง ใน LISP รายการจะถูกสร้างขึ้นเป็นห่วงโซ่ของโครงสร้างเรกคอร์ดธรรมดาที่ชื่อcons เชื่อมโยงเข้าด้วยกัน
โครงสร้างบันทึกข้อเสีย
ก cons เป็นโครงสร้างเร็กคอร์ดที่มีส่วนประกอบสองอย่างที่เรียกว่า car และ cdr.
เซลล์จุดด้อยหรือจุดด้อยคือวัตถุคือคู่ของค่าที่สร้างขึ้นโดยใช้ฟังก์ชัน cons.
consฟังก์ชันรับสองอาร์กิวเมนต์และส่งกลับเซลล์ข้อเสียใหม่ที่มีค่าสองค่า ค่าเหล่านี้สามารถอ้างอิงถึงวัตถุชนิดใดก็ได้
หากค่าที่สองไม่ใช่ศูนย์หรือเซลล์ข้อเสียอื่นระบบจะพิมพ์ค่าเป็นคู่จุดที่ล้อมรอบด้วยวงเล็บ
ค่าสองค่าในเซลล์ข้อเสียเรียกว่า car และ cdr. car ฟังก์ชันใช้เพื่อเข้าถึงค่าแรกและ cdr ฟังก์ชันใช้เพื่อเข้าถึงค่าที่สอง
ตัวอย่าง
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(write (cons 1 2))
(terpri)
(write (cons 'a 'b))
(terpri)
(write (cons 1 nil))
(terpri)
(write (cons 1 (cons 2 nil)))
(terpri)
(write (cons 1 (cons 2 (cons 3 nil))))
(terpri)
(write (cons 'a (cons 'b (cons 'c nil))))
(terpri)
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(terpri)
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)
แสดงให้เห็นตัวอย่างข้างต้นว่าโครงสร้างข้อเสียสามารถนำมาใช้ในการสร้างรายการที่เชื่อมโยงเดียวเช่นรายการ (ABC) ประกอบด้วยสามข้อเสียเซลล์เชื่อมโยงเข้าด้วยกันโดยพวกเขาCDRs
ตามแผนภาพอาจแสดงเป็น -
รายการใน LISP
แม้ว่าเซลล์ข้อเสียสามารถใช้เพื่อสร้างรายการได้อย่างไรก็ตามการสร้างรายการจากการซ้อนกัน consการเรียกใช้ฟังก์ชันไม่สามารถเป็นทางออกที่ดีที่สุด list ค่อนข้างใช้สำหรับการสร้างรายการใน LISP
ฟังก์ชัน list สามารถรับอาร์กิวเมนต์จำนวนเท่าใดก็ได้และเนื่องจากเป็นฟังก์ชันจึงประเมินอาร์กิวเมนต์
first และ restฟังก์ชันให้องค์ประกอบแรกและส่วนที่เหลือของรายการ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิด
ตัวอย่าง 1
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(write (list 1 2))
(terpri)
(write (list 'a 'b))
(terpri)
(write (list 1 nil))
(terpri)
(write (list 1 2 3))
(terpri)
(write (list 'a 'b 'c))
(terpri)
(write (list 3 4 'a (car '(b . c)) (* 4 -2)))
(terpri)
(write (list (list 'a 'b) (list 'c 'd 'e)))
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))
ตัวอย่าง 2
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(defun my-library (title author rating availability)
(list :title title :author author :rating rating :availabilty availability)
)
(write (getf (my-library "Hunger Game" "Collins" 9 t) :title))
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
"Hunger Game"
ฟังก์ชั่นการจัดการรายการ
ตารางต่อไปนี้แสดงฟังก์ชันการจัดการรายการที่ใช้กันทั่วไป
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | car ใช้รายการเป็นอาร์กิวเมนต์และส่งกลับองค์ประกอบแรก |
2 | cdr ใช้รายการเป็นอาร์กิวเมนต์และส่งคืนรายการโดยไม่มีองค์ประกอบแรก |
3 | cons ใช้อาร์กิวเมนต์สองรายการองค์ประกอบและรายการและส่งคืนรายการโดยแทรกองค์ประกอบไว้ที่ตำแหน่งแรก |
4 | list ใช้อาร์กิวเมนต์จำนวนเท่าใดก็ได้และส่งกลับรายการที่มีอาร์กิวเมนต์เป็นองค์ประกอบสมาชิกของรายการ |
5 | append รวมสองรายการขึ้นไปเป็นรายการเดียว |
6 | last ใช้รายการและส่งกลับรายการที่มีองค์ประกอบสุดท้าย |
7 | member ต้องใช้สองอาร์กิวเมนต์ซึ่งอันที่สองต้องเป็นรายการถ้าอาร์กิวเมนต์แรกเป็นสมาชิกของอาร์กิวเมนต์ที่สองจากนั้นจะส่งกลับส่วนที่เหลือของรายการโดยเริ่มต้นด้วยอาร์กิวเมนต์แรก |
8 | reverse รับรายการและส่งคืนรายการที่มีองค์ประกอบด้านบนตามลำดับย้อนกลับ |
โปรดทราบว่าฟังก์ชันลำดับทั้งหมดใช้ได้กับรายการ
ตัวอย่างที่ 3
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(write (car '(a b c d e f)))
(terpri)
(write (cdr '(a b c d e f)))
(terpri)
(write (cons 'a '(b c)))
(terpri)
(write (list 'a '(b c) '(e f)))
(terpri)
(write (append '(b c) '(e f) '(p q) '() '(g)))
(terpri)
(write (last '(a b c d (e f))))
(terpri)
(write (reverse '(a b c d (e f))))
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)
การเชื่อมต่อของรถและฟังก์ชั่น cdr
car และ cdr ฟังก์ชันและชุดค่าผสมช่วยให้สามารถแยกองค์ประกอบ / สมาชิกเฉพาะของรายการได้
อย่างไรก็ตามลำดับของฟังก์ชัน car และ cdr สามารถย่อได้โดยการต่อตัวอักษร a สำหรับ car และ d สำหรับ cdr ภายในตัวอักษร c และ r
ตัวอย่างเช่นเราสามารถเขียน cadadr เพื่อย่อลำดับของการเรียกฟังก์ชัน - car cdr car cdr
ดังนั้น (cadadr '(a (cd) (efg))) จะส่งกลับ d
ตัวอย่างที่ 4
สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้
(write (cadadr '(a (c d) (e f g))))
(terpri)
(write (caar (list (list 'a 'b) 'c)))
(terpri)
(write (cadr (list (list 1 2) (list 3 4))))
(terpri)
เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -
D
A
(3 4)