Лисп стиль: setq против setf - PullRequest
23 голосов
/ 09 июня 2009

Питер Норвиг отмечает в Парадигмах программирования искусственного интеллекта , на стр. 50 , компромисс между спецификой и согласованностью, а также при выборе использования setq или setf для обновления переменной до значение. Что вы порекомендуете? Вы когда-нибудь сталкивались с ситуацией, когда это имело значение гораздо выше читабельности?

Ответы [ 6 ]

17 голосов
/ 09 июня 2009

Использование setq более низкоуровневое, но производительность setf не является проблемой. И setf позволяет вам (или авторам библиотек) обеспечивать настраиваемое поведение setf, например, задавать части пользовательских структур данных. Я говорю: ходите с setf везде, если у вас нет причин не делать этого.

Также см. Практический Common Lisp, глава 3: «Макрос SETF является основным оператором присваивания Common Lisp». PCL доступен онлайн бесплатно: http://gigamonkeys.com/book/

11 голосов
/ 12 июня 2009

FWIW, я всегда использую setf. Если я немного изменяю структуру своего кода, мне просто нужно изменить «место» вместо места и оператора (setq -> setf).

Кроме того, не беспокойтесь о производительности, setf точно такой же, как setq для символов:

CL-USER> (macroexpand '(setf foo 42))
(SETQ FOO 42)
10 голосов
/ 09 июня 2009

Вы можете использовать setf везде, где вы могли бы использовать setq. На самом деле, setf - это макрос, основанный на setq. Таким образом, это должно быть чисто читабельным и стилевым вопросом.

Почти весь код, который я видел, избегает использования setq и использует setf.

3 голосов
/ 12 июня 2009

setf - это «поле установки», оно меняет место и может иметь пользовательские расширения. setq устанавливается с цитированием первого аргумента.

1 голос
/ 11 июня 2009

Я рекомендую вам следовать последнему совету Norvig в этом разделе: будьте последовательны. «Удобочитаемость» - это, конечно, самая важная причина для выбора в программировании. Если важно сообщить читателю (возможно, вам через 2 месяца), что вы имеете дело со всей ячейкой значения символа, используйте setq; в противном случае используйте setf. Но только если вы последовательны.

0 голосов
/ 12 июня 2009

Вы не ошибетесь, если будете использовать setf везде вместо setq.

Это такие вещи, которые мешают Common Lisp идти вперед, множество неиспользуемых вещей, которые разработчики все еще должны поддерживать.

...