協會列表(Alists)

關聯清單(或alist)是Scheme中的基本資料結構,用於表示鍵值對的集合。它被實現為一個對的列表,其中每對將一個鍵(通常是一個符號)與一個值相關聯。清單簡單、靈活,非常適合中小型資料集。

關聯清單的結構

alist 是一個列表,其中每個元素都是一個(使用 cons 構造)。每對包括:

  • :第一個元素(通常是符號)。
  • Value:第二個元素,可以是任何資料型態。
(define alist '((name . "Alice") (age . 30) (city . "Paris")))
  • 金鑰'name'age'city
  • "Alice"30"Paris"
  • 結構:對列表: ((name . "Alice") (age . 30) (city . "Paris"))

建立一個列表

您可以透過手動建立對或使用 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"))

使用反引號 (`) and Comma (,)

反引號 (`) 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")))

存取清單中的數據

若要從清單中檢索值,您可以使用 assoc 函數,該函數透過鍵找到一對。

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

提取值

使用 assoc 檢索一對後,請使用 cdr 提取該值:

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

主要功能總結

  • 單引號 ('):建立一個靜態列表,其中所有元素都是文字資料。
  • 反引號 (`): Allows dynamic creation of alists by mixing static elements with evaluated expressions (using ,)。
  • 點符號 (.):用於建構對,將鍵與列表中的值關聯起來。