Каковы типичные случаи использования (defun (setf…)) defsetf и define-setf-expander - PullRequest
0 голосов
/ 16 февраля 2019

При разработке с Common Lisp у нас есть три возможности определить новые setf -формы:

  • Мы можем определить функцию, имя которой представляет собой список из двух символов, первыйодин из которых setf, например (defun (setf some-observable) (…)).

  • Мы можем использовать краткую форму defsetf.

  • Мы можем использоватьдлинная форма defsetf.

  • Мы можем использовать define-setf-expander.

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

Ответ на этот вопрос может подсказывать наиболее общее решение и наметить контексты, где другие решения превосходят.

1 Ответ

0 голосов
/ 17 февраля 2019

define-setf-expander является наиболее общим из них.Все функциональные возможности setf охватываются им.

Определение функции setf прекрасно работает для большинства методов доступа.Также допустимо использовать обобщенную функцию, поэтому полиморфизм недостаточен, чтобы требовать использования чего-то другого.Управление оценкой правильности или производительности является основной причиной, по которой не использует функцию setf.

Для правильности многие формы деструктурирования невозможно выполнить с помощью функции setf (например, (setf (values ...) ...)).Точно так же я видел пример, в котором функциональные структуры данных ведут себя локально, как изменяемые, изменяя (setf (dict-get key some-dict) 2), чтобы назначить новый словарь для some-dict.

Для производительности рассмотрим глупый случай (incf (nth 10000 list))который, если бы писатель nth был реализован как функция, потребовал бы обхода узлов списка 10k дважды, но в расширителе setf это можно сделать за один проход.

...