Символы ключевых слов
:foo
- это ключевое слово символ .
- интернировано и экспортированоиз пакета
KEYWORD
- постоянно привязан к себе
Использование
Символы ключевых слов используются, когда необходимо сочетание следующихсвойства:
- символ - правильная структура данных
- символы с одинаковыми именами должны быть уникальными (заключая их в пакет) -> пакет
KEYWORD
- различные пакеты не нужны или не нужны -> пакет
KEYWORD
- написание символа должно быть простым, без необходимости указывать их в кавычках ->
:foo
лучше, чем ':foo
- возможность действовать как переменная с разными значениями не требуется ->
:foo
оценивает себя как :foo
и только :foo
В Common Lisp обычно символы могут находиться в пакете (видпространства имен).
Неэкспортированный символ bar
в пакете foo
записывается как foo::bar
.Двойное двоеточие находится между именем пакета и именем символа.
Тогда экспортируемый символ записывается как foo:bar
.Используется одиночное двоеточие.
Если символ доступен в текущем пакете, то записывается как bar
без пакета.
Пакет KEYWORD
Существует специальный пакет под названием KEYWORD
.Символ bar
в этом пакете просто и всегда записывается как :bar
.
Примеры
Эти ключевые символы также имеют следующие интересные свойства: символы автоматическиэкспортируется из пакета KEYWORD
(поэтому keyword::bar
, keyword:bar
, ::bar
и :bar
являются одним и тем же символом), и они оценивают себя:
CL-USER 5 > :bar
:BAR
CL-USER 6 > (describe :bar)
:BAR is a SYMBOL
NAME "BAR"
VALUE :BAR
FUNCTION #<unbound function>
PLIST NIL
PACKAGE #<The KEYWORD package, 0/4 internal, 5830/8192 external>
CL-USER 7 > (eq 'keyword::bar ':bar)
T
CL-USER 8 > (eq :bar ':bar) ; quoted or unquoted, each subform evaluates to :bar
T
Использование
Символы ключевых слов используются, например, в качестве имен в именованных аргументах:
(defun foo (&key bar) (+ bar 10))
(foo :bar 7)
Обычно они также используются в аргументах для создания экземпляра и структуры.
(defstruct node state parent action)
DEFSTRUCT
- это макрос Common Lisp, который генерирует несколько функций.Одной из них является функция MAKE-NODE
, которую можно использовать как:
(make-node :state 'open
:parent some-parent
:action an-action)
Примечание: иногда данные также могут быть ключевыми словами.Например, в приведенной выше форме состояние может быть :open
, а не open
:
(make-node :state :open
:parent some-parent
:action an-action)