Учебники

ЛИСП — Символы

В LISP символ — это имя, которое представляет объекты данных и, что интересно, это также объект данных.

Что делает символы особенными, так это то, что они имеют компонент, называемый списком свойств или списком свойств.

Списки недвижимости

LISP позволяет назначать свойства символам. Например, пусть у нас есть объект person. Нам бы хотелось, чтобы этот объект «человек» имел такие свойства, как имя, пол, рост, вес, адрес, профессия и т. Д. Свойство похоже на имя атрибута.

Список свойств реализован как список с четным числом (возможно, нулем) элементов. Каждая пара элементов в списке представляет собой запись; первый элемент — индикатор, а второй — значение.

Когда символ создан, его список свойств изначально пуст. Свойства создаются с помощью get в форме setf .

Например, следующие операторы позволяют нам назначать свойства title, author и издатель и соответствующие значения для объекта с именем (symbol) ‘book’.

Пример 1

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (setf (get 'books'title) '(Gone with the Wind)))
(terpri)
(write (setf (get 'books 'author) '(Margaret Michel)))
(terpri)
(write (setf (get 'books 'publisher) '(Warner Books)))

Когда вы выполняете код, он возвращает следующий результат —

(GONE WITH THE WIND)
(MARGARET MICHEL)
(WARNER BOOKS)

Различные функции списка свойств позволяют назначать свойства, а также извлекать, заменять или удалять свойства символа.

Функция get возвращает список свойств символа для данного индикатора. Он имеет следующий синтаксис —

get symbol indicator &optional default

Функция get ищет список свойств данного символа для указанного индикатора, если найден, то возвращает соответствующее значение; в противном случае возвращается значение по умолчанию (или ноль, если значение по умолчанию не указано).

Пример 2

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(setf (get 'books 'title) '(Gone with the Wind))
(setf (get 'books 'author) '(Margaret Micheal))
(setf (get 'books 'publisher) '(Warner Books))

(write (get 'books 'title))
(terpri)
(write (get 'books 'author))
(terpri)
(write (get 'books 'publisher))

Когда вы выполняете код, он возвращает следующий результат —

(GONE WITH THE WIND)
(MARGARET MICHEAL)
(WARNER BOOKS)

Функция symbol-plist позволяет увидеть все свойства символа.

Пример 3

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))

Когда вы выполняете код, он возвращает следующий результат —

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)

Функция remprop удаляет указанное свойство из символа.

Пример 4

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))
(remprop 'annie 'age)
(terpri)
(write (symbol-plist 'annie))

Когда вы выполняете код, он возвращает следующий результат —