รายการเชื่อมโยง (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 ไม่สามารถประเมินนิพจน์ได้ ทำให้เหมาะอย่างยิ่งสำหรับการสร้างรายการคงที่โดยที่คีย์และค่าทั้งหมดเป็นแบบฮาร์ดโค้ด

;; กำหนด alist ด้วยตนเอง
(define alist '((name . "Alice") (age . 30) (city . "Paris")))

;; เพิ่มคู่ใหม่แบบโปรแกรม
(define updated-alist (cons '(country . "France") alist))

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

การใช้ backquote (`) และเครื่องหมายจุลภค (,)

ตัวดำเนินการ backquote (`) คล้าย single quote แต่ช่วยให้แทรกนิพจน์ที่ประเมินแล้วได้แบบไดนามิกด้วย 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")))

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

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

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

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

(assoc 'name alist)   ; คืนค่า (name . "Alice")
(assoc 'country alist) ; คืนค่า #f (ไม่พบคีย์)

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

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

(cdr (assoc 'name alist))   ; คืนค่า "Alice"

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

  • Single Quote ('): สร้างรายการคงที่โดยที่องค์ประกอบทั้งหมดเป็นข้อมูลตามตัวอักษร
  • Backquote (`): ช่วยให้สร้าง alist แบบไดนามิกได้โดยผสมองค์ประกอบคงที่กับนิพจน์ที่ประเมินแล้ว (ใช้ ,)
  • Dot Notation (.): ใช้เพื่อสร้างคู่ เชื่อมโยงคีย์กับค่าในรายการ