Символы

Символы — это один из основных типов данных в Scheme, представляющий уникальные неизменяемые идентификаторы. В основном они используются в программах в качестве ключей, маркеров или заполнителей, что делает их незаменимыми для написания чистого и выразительного кода.

Символ в Scheme похож на строку, но отличается тем, что символы являются уникальными и атомарными. Это означает, что два символа с одинаковым именем гарантированно будут одним и тем же объектом, что позволяет быстро проверять равенство и эффективно использовать их в структурах данных.

Синтаксис

Символ записывается как последовательность символов:

  • Начинается с буквы, за которой следуют буквы, цифры или специальные символы, например -, + или *.
  • По умолчанию символы чувствительны к регистру.

Примеры:

'hello       ; A symbol named `hello`
'foo-bar     ; A symbol named `foo-bar`
'*special*   ; A symbol named `*special*`

Создание символов

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

Пример

'my-symbol   ; Creates the symbol `my-symbol`

Вы также можете создавать символы программным путем с помощью процедуры string->symbol, которая преобразует строку в символ.

(string->symbol "dynamic-symbol")

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

Сравнение символов

Поскольку символы уникальны, их можно эффективно сравнивать с помощью eq?.

Пример

(eq? 'apple 'apple)   ; #t (same symbol)
(eq? 'apple 'orange)  ; #f (different symbols)

Это делает символы идеальными для использования в качестве ключей в структурах данных или маркеров в вашем коде.

Использование символов

Символы часто используются в схеме для:

  1. Ключи в списках ассоциаций:
(define alist '((name . "Alice") (age . 30) (city . "Paris")))
(assoc 'name alist)   ; Returns (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 (true: it's a symbol)
(symbol->string 'example)     ; "example"
(string->symbol "new-symbol") ; 'new-symbol

Резюме

Символы — это простой и эффективный способ представления идентификаторов, ключей и маркеров в Scheme. Их неизменность и быстрая проверка подлинности делают их идеальными для многих задач программирования. Понимание того, как эффективно использовать символы, повысит вашу способность писать чистый и выразительный код Scheme.