Списки асоціацій (alist)

Список асоціацій (або alist) — це фундаментальна структура даних у Scheme для представлення колекцій пар ключ–значення. Він реалізований як список пар, де кожна пара пов’язує ключ (зазвичай символ) зі значенням. Alist прості, гнучкі та добре підходять для невеликих і середніх наборів даних.

Структура списку асоціацій

Alist — це список, у якому кожен елемент є парою (створеною за допомогою cons). Кожна пара складається з:

  • Ключа: першого елемента (зазвичай символу).
  • Значення: другого елемента, який може мати будь-який тип даних.
(define alist '((name . "Alice") (age . 30) (city . "Paris")))
  • Ключі: 'name, 'age, 'city
  • Значення: "Alice", 30, "Paris"
  • Структура: список пар: ((name . "Alice") (age . 30) (city . "Paris"))

Створення alist

Alist можна створити вручну, побудувавши пари, або програмно за допомогою cons.

Використання одинарної лапки (')

Одинарна лапка (') — скорочення для цитування, яке не дає Scheme обчислити вираз. Це зручно для статичних alist, де всі ключі та значення задані наперед.

;; Визначити alist вручну
(define alist '((name . "Alice") (age . 30) (city . "Paris")))

;; Програмно додати нову пару
(define updated-alist (cons '(country . "France") alist))

Результат: ((country . "France") (name . "Alice") (age . 30) (city . "Paris"))

Використання зворотної лапки (`) і коми (,)

Зворотна лапка (`) схожа на одинарну, але дозволяє динамічно вставляти обчислені вирази за допомогою коми (,). Це корисно для alist, де ключі або значення обчислюються під час виконання.

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

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

Результат: ((name . "Alice") (age . 30) (city . "Paris"))

Порівняння прикладів

Статичний alist за допомогою `’``:

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

Динамічний alist за допомогою ` і ,:

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

Доступ до даних у alist

Щоб отримати значення з alist, використовуйте функцію assoc, яка шукає пару за ключем.

(assoc 'name alist)    ; Повертає (name . "Alice")
(assoc 'country alist) ; Повертає #f (ключ не знайдено)

Вилучення значення

Отримавши пару за допомогою assoc, використовуйте cdr, щоб отримати значення:

(cdr (assoc 'name alist))   ; Повертає "Alice"

Огляд основних можливостей

  • Одинарна лапка ('): створює статичний alist, де всі елементи є літеральними даними.
  • Зворотна лапка (`): дозволяє динамічно створювати alist, поєднуючи статичні елементи з обчисленими виразами (за допомогою ,).
  • Крапкова нотація (.): використовується для побудови пар, що пов’язують ключ і значення в alist.