LISP - символы

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

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

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

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

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

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

Например, следующие операторы позволяют нам назначать свойства title, автора и издателя, а также соответствующие значения объекту с именем (символ) «книга».

Пример 1

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

(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 и введите в него следующий код.

(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 и введите в него следующий код.

(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 и введите в него следующий код.

(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))

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

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT)