Стиль Lisp: setq по сравнению с setf

В моем случае я искал услуги. Затем нашел службу под названием «SQL Server (SQLEXPRESS)». Затем щелкните правой кнопкой мыши на этом. Выберите свойства. Затем нажмите «Пуск». Вот и все. Решил проблему.

24
задан Brendan Foote 9 June 2009 в 18:29
поделиться

6 ответов

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

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

18
ответ дан 28 November 2019 в 23:37
поделиться

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

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

10
ответ дан 28 November 2019 в 23:37
поделиться

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

3
ответ дан 28 November 2019 в 23:37
поделиться

FWIW, I always use setf. If I change the structure of my code slightly, I just need to change the "place" instead of the place and the operator (setq -> setf).

Also, don't worry about performance, setf is exactly the same as setq for symbols:

CL-USER> (macroexpand '(setf foo 42))
(SETQ FOO 42)
11
ответ дан 28 November 2019 в 23:37
поделиться

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

1
ответ дан 28 November 2019 в 23:37
поделиться

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

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

-2
ответ дан 28 November 2019 в 23:37
поделиться