Символи

Символи — один із основних типів даних у Scheme: унікальні незмінні ідентифікатори. Їх переважно використовують як ключі, маркери або заповнювачі, тому вони незамінні для чистого і виразного коду.

Символ у Scheme схожий на рядок, але відрізняється тим, що символи унікальні та атомарні. Два символи з однаковою назвою гарантовано є одним об’єктом, що дає швидку перевірку рівності та ефективне використання в структурах даних.

Синтаксис

Символ записують як послідовність символів:

  • Починається з літери, далі — літери, цифри або спеціальні символи, наприклад -, + або *.
  • За замовчуванням символи чутливі до регістру.

Приклади:

'hello       ; Символ `hello`
'foo-bar     ; Символ `foo-bar`
'*special*   ; Символ `*special*`

Створення символів

Символи зазвичай створюють оператором quote ('), який каже Scheme трактувати ім’я як символ, а не оцінювати його як змінну чи функцію.

Приклад

'my-symbol   ; Створює символ `my-symbol`

Символи також можна створювати програмно процедурою string->symbol, яка перетворює рядок на символ.

(string->symbol "dynamic-symbol")

Результат: 'dynamic-symbol

Порівняння символів

Оскільки символи унікальні, їх ефективно порівнюють через eq?.

Приклад

(eq? 'apple 'apple)   ; #t (той самий символ)
(eq? 'apple 'orange)  ; #f (різні символи)

Це робить символи ідеальними як ключі в структурах даних або маркери в коді.

Використання символів

У Scheme символи часто використовують для:

  1. Ключів у списках асоціацій:
(define alist '((name . "Alice") (age . 30) (city . "Paris")))
(assoc 'name alist)   ; Повертає (name . "Alice")
  1. Ідентифікаторів у коді:
   (define my-symbol 'foo)
   (if (eq? my-symbol 'foo)
       "It's foo!"
       "It's something else.")

Процедури для роботи з символами

Scheme містить вбудовані процедури для роботи з символами:

ПроцедураОпис
symbol?Перевіряє, чи об’єкт є символом.
eq?Порівнює два символи за ідентичністю (швидке порівняння).
symbol->stringПеретворює символ на рядок (корисно для відображення чи налагодження).
string->symbolПеретворює рядок на символ (корисно для динамічного створення ідентифікаторів).

Приклади

(symbol? 'example)            ; #t (це символ)
(symbol->string 'example)     ; "приклад"
(string->symbol "new-symbol") ; 'новий символ

Підсумок

Символи — легкий і ефективний спосіб представлення ідентифікаторів, ключів і маркерів у Scheme. Їхня незмінність і швидка перевірка ідентичності роблять їх ідеальними для багатьох завдань програмування. Розуміння символів покращить вашу здатність писати чистий і виразний код Scheme.