Инструменты пользователя

Инструменты сайта


examination:flp:question40

Системные и определяемые свойства в РС –Лиспе. Глобальность свойств в РС – Лиспе.

Системные и определяемые свойства

В предыдущих главах мы показали, что с символом связаны лишь его имя, произвольное, назначенное функцией присваивания (SETQ), значение и назначенное определением функции (DEFUN) описание вычислений (лямбда-выражение). Значение и определение функции являются встроенными системными свойствами, которые управляют работой интерпретатора в различных ситуациях. Функции, используемые для чтения и изменения этих свойств (SETQ, SYMBOL-VALUE, DEFUN, FUNCTION-VALUE и другие), мы уже ранее рассматривали. Весь список свойств также является системным свойством. Работающие со свойствами символов прикладные системы могут свободно определять новые свойства.

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

Чтение свойства

Выяснить значение свойства, связанного с JP /А символом, можно с помощью функции GET:

К

(GET символ свойство)

Если, например, с символом ЯГОДА-РЯБИНЫ связан определенный нами ранее список свойств, то мы получим следующие результаты:

(get 'ягода-рябины 'вкус) КИСЛЫП

_(get 'ягода-рябины 'вес) NIL

Так как у символа ЯГОДА-РЯБИНЫ нет свойства ВЕС, то GET вернет значение NIL.

Присваивание свойства

Присваивание нового свойства или изменение значения существующего свойства в основных диалектах языка Лисп осуществляется псевдофункцией PUTPROP (put property)' или PUT:

(PUTPROP символ свойство значение)

В Коммон Лиспе функции PUTPROP не существует. Свойства символов находятся в связанных с символами ячейках памяти, для присваивания значений которым используется обобщенная функция присваивания SETF. Присваивание свойства в Коммон Лиспе осуществляется через функции SETF и GET следующим образом:

(SETF (GET символ свойство) значение)

Здесь вызов GET возвращает в качестве значения ячейку памяти для данного свойства, содержимое которой обновляет вызов SETF. Присваивание будет работать и в том случае, если ранее у символа не было такого свойства. Приведем пример:

_(setf (get 'ягода-рябины 'вес) '(2 g)) (2 G)

_(get 'ягода-рябины 'вес) (2 G)

Побочным эффектом вызова будет изменение списка свойств символа ЯГОДА-РЯБИНЫ следующим образом:

(ВЕС (2 G) ВКУС КИСЛЫЙ ЦВЕТ КРАСНЫЙ)

Псевдофункция SETF меняет физическую структуру списка свойств. Поэтому использование другихсписков как части списка свойств без их предварительного копирования может привести к неожиданным ошибкам.

Свойства символа

Удаление свойства

Удаление свойства и его значения осуществляется псевдофункцией REMPROP:

(REMPROP символ свойство)

Приведем пример:

_(remprop 'ягода-рябины 'вкус) ВКУС

_(get 'ягода-рябины 'вкус) NIL

Псевдофункция REMPROP возвращает в качестве значения имя удаляемого свойства. Если удаляемого свойства нет, то возвращается NIL. Свойство можно удалить, присвоив ему значение NIL. В этом случае имя свойства и значение NIL физически остаются в списке свойств. Читать из списка свойств, создавать и обновлять в ием свойства можно не только по отдельности, но и целиком. Например, в Коммон Лиспе значением вызова

(SYMBOL-PLIST символ)

является весь список свойств:

_(symbol-plist 'ягода-рябины) (ВЕС (2 G) ЦВЕТ КРАСНЫЙ)

Свойства глобальны

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

Список свойств используется во многих системных программах Лисп-систем. Наличие свойств полезно как для поддержки работы самой Лисп-системы, так и во многих типичных случаях представления данных. Использование свойств дает средства для рассматриваемого позже программирования, управляемого данными, с помощью которого можно реализовать различные языки представления знаний и формализмы, такие как семантические сети (semantic net), фреймы (frame) и объекты объектно-ориентированного программирования (object, flavor).

В некоторых системах можно использовать в качестве обобщения так называемые свободные списки свойств (disembodied property list), несвязанные с каким-либо символом.

examination/flp/question40.txt · Последние изменения: 2014/01/15 08:17 (внешнее изменение)