Lisp plist только в контексте ячейки списка свойств символа? - PullRequest
1 голос
/ 05 февраля 2020

По сути, мне интересно, существует ли в Common Lisp такая вещь, как plist, вне концепции встроенного списка свойств символа. Поэтому, если у меня есть

(setq Joe '(:fav-season  "Fall" :fav-color  "Blue"))

, тогда я делаю

(setf (get 'Joe 'fav-season) "Summer")
(setf (get 'Joe 'fav-color) "Green")

У меня есть два отдельных списка, связанных с Joe, идущими одновременно, один ad-ho c, другой "официальный", потому что он связан с символом Joe.

(get 'Joe 'fav-color)
"Green"

или

(symbol-plist 'Joe)
(FAV-COLOR "Green" FAV-SEASON "Summer")

Так что я предполагаю прямое присвоение plist-подобного структура для Joe (присваивание ячейке значения символа Joes) не является действительно поддерживаемой структурой данных (например, get, getf et c.), как с символом Joe список свойств. Ни как alist, который всегда является значением переменной и имеет assoc, rassoc, et c. Могу ли я поэтому заключить, что в действительности не используется концепция plist в реальном мире, кроме встроенной символьной ячейки для списков свойств? Так часто в уроках plist автоматически описывается как список свойств символа, и дальнейшее обсуждение концепции не происходит.

Думаю, в обратном направлении, я преследую довольно смутное, пятнистое представление о том, что хорошие, передовые практики структур данных в Лиспе.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Нет, они используются повсеместно, в качестве облегченной конструкции «карта». Например, в популярной библиотеке alexandria есть функции для преобразования между alists, plists и ha sh -tables. Скорее всего, списки символов несколько вышли из употребления.

2 голосов
/ 05 февраля 2020

Используйте GETF для извлечения значений из списка, который является списком свойств.

CL-USER 141 > (let ((joe '(:fav-season  "Fall"
                           :fav-color  "Blue")))
                (list (getf joe 'fav-color)
                      (getf joe :fav-color)))
(NIL "Blue")

Обратите внимание, что вам нужно получить индикатор вправо.

Вы использовали GET, который может быть реализован в терминах GETF:

(defun get (x y)
  (getf (symbol-plist x) y))

Таким образом, можно использовать списки свойств не только в списках свойств символов - есть базовый оператор c для него.

Обратите также внимание на то, что существует много других структур данных, которые обеспечивают доступ к значениям с помощью ключей: списки asso c, классы CLOS, таблицы ha sh. Для них существуют несколько иные варианты использования.

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

Функции используют список свойств, например списки для аргументов ключевых слов, которыми можно манипулировать:

(let ((foo (list 'window :x 100 :y 200)))
   (setf (getf (rest foo) :x) 200)
   (apply #'make-instance foo))

Иногда списки свойств добавляются в классы или структуры CLOS. Структуры в Common Lisp могут не быть расширяемыми во время выполнения - их нельзя переопределить дополнительными слотами. Поэтому часто некоторые классы и структуры имеют слот свойств, куда можно во время выполнения добавить / удалить / обновить пары ключ / значение.

...