รายชื่อสมาคม (Alists)

รายการการเชื่อมโยง (หรือ รายการ) เป็นโครงสร้างข้อมูลพื้นฐานในโครงการที่ใช้เพื่อแสดงคอลเลกชันของคู่คีย์-ค่า มันถูกนำไปใช้เป็นรายการคู่ โดยที่แต่ละคู่เชื่อมโยงคีย์ (โดยทั่วไปคือสัญลักษณ์) กับค่า รายการมีความเรียบง่าย ยืดหยุ่น และเหมาะสำหรับชุดข้อมูลขนาดเล็กถึงขนาดกลาง

โครงสร้างรายชื่อสมาคม

อลิสต์คือรายการที่แต่ละองค์ประกอบเป็น คู่ (สร้างด้วย cons) แต่ละคู่ประกอบด้วย:

  • คีย์: องค์ประกอบแรก (โดยทั่วไปจะเป็นสัญลักษณ์)
  • ค่า: องค์ประกอบที่ 2 ซึ่งอาจเป็นข้อมูลประเภทใดก็ได้
(define alist '((name . "Alice") (age . 30) (city . "Paris")))
  • คีย์: 'name, 'age, 'city
  • มูลค่า: "Alice", 30, "Paris"
  • โครงสร้าง: รายการคู่: ((name . "Alice") (age . 30) (city . "Paris"))

การสร้าง Alist

คุณสามารถสร้างรายการได้โดยการสร้างคู่ด้วยตนเองหรือสร้างโดยทางโปรแกรมโดยใช้ cons

การใช้คำพูดเดี่ยว (')

เครื่องหมายคำพูดเดี่ยว (') เป็นการย่อสำหรับ quoting ซึ่งทำให้ Scheme ไม่สามารถประเมินนิพจน์ได้ ทำให้เหมาะอย่างยิ่งสำหรับการสร้างรายการคงที่โดยที่คีย์และค่าทั้งหมดเป็นแบบฮาร์ดโค้ด

;; Manually define an alist
(define alist '((name . "Alice") (age . 30) (city . "Paris")))

;; Programmatically add a new pair
(define updated-alist (cons '(country . "France") alist))

ผลลัพธ์: ((country . "France") (name . "Alice") (age . 30) (city . "Paris"))

การใช้ Backquote (`) and Comma (,)

ตัวดำเนินการ backquote (`) is similar to the single quote but allows you to dynamically insert evaluated expressions using the comma (,) สิ่งนี้มีประโยชน์สำหรับการสร้างรายการที่มีการคำนวณคีย์หรือค่าขณะรันไทม์

(define key 'name)
(define value "Alice")

(define alist `((,key . ,value) (age . 30) (city . "Paris")))

ผลลัพธ์: ((name . "Alice") (age . 30) (city . "Paris"))

ตัวอย่างการเปรียบเทียบ

รายการคงที่โดยใช้ ':

(define alist '((name . "Alice") (age . 30) (city . "Paris")))

รายการแบบไดนามิกโดยใช้ ` and ,:

(define key 'name)
(define value "Alice")
(define alist `((,key . ,value) (age . 30) (city . "Paris")))

การเข้าถึงข้อมูลใน Alist

หากต้องการดึงค่าจากรายการ คุณสามารถใช้ฟังก์ชัน assoc ซึ่งจะค้นหาคู่ด้วยคีย์

(assoc 'name alist)   ; Returns (name . "Alice")
(assoc 'country alist) ; Returns #f (key not found)

การแยกคุณค่า

เมื่อคุณดึงข้อมูลคู่โดยใช้ assoc ให้ใช้ cdr เพื่อแยกค่า:

(cdr (assoc 'name alist))   ; Returns "Alice"

สรุปคุณสมบัติที่สำคัญ

  • Single Quote ('): สร้างรายการคงที่โดยที่องค์ประกอบทั้งหมดเป็นข้อมูลตามตัวอักษร
  • ราคาย้อนกลับ (`): Allows dynamic creation of alists by mixing static elements with evaluated expressions (using ,)
  • Dot Notation (.): ใช้เพื่อสร้างคู่ เชื่อมโยงคีย์กับค่าในรายการ