Setf и другие спискоразрушающие функции. Когда их применение оправдано? - Lisp
Формулировка задачи:
Ознакомившись с функциями rplaca, rplacd, я решил никогда, без крайней нужды, не применять спискоразрушающие функции. Но, меня смущает то, что спискоразрушающий setf объявлен стандартом, а его несприскоразрушающий аналог setq объявлен устаревшим. Это говорит о том что я что-то не так понимаю.
Очевидно, setf удобнее в использовании, ведь он позволяет, например, написать следующую конструкцию:
(setf (car x) y)
, которая развернётся в код:
(rplaca x y)
Но, ведь можно было бы развернуть следующим образом:
(setq x (cons y (cdr x)))
Очевидно, что первый способ быстрее. Но, спискоразрушающие функции всегда быстрее, а используют их, как я понял, на так уж и часто. Т.е., просто, различия в скорости - недостаточный аргумент.
Дело только в отсутствии неспискоразрушающего аналоги setf? Но, на мой неискушённый взгляд, такую функцию вполне можно создать. Я пока не рискнул это сделать из-за плохого понимания синтаксиса языка.
Итак, я хотел бы уточнить у местных lisp-программистов:
1) Как часто и в каких случаях Вы используете спискоразрушающие функции (кроме setf)?
2) Как часто и в каких случаях Вы используете setf?
3) Есть ли причина считать setf безопаснее прочих спискоразрушающих функций?
Решение задачи: «Setf и другие спискоразрушающие функции. Когда их применение оправдано?»
textual
Листинг программы
> (let ((a (list 1 2 3))) (let ((b (cons 9 a))) (format t "b: ~S~%" b) (setf (second a) 100000) (format t "b: ~S~%" b))) b: (9 1 2 3) b: (9 1 100000 3)
Объяснение кода листинга программы
В данном коде используется два let-выражения.
- В первом let-выражении создается список a с тремя элементами: 1, 2, 3.
- Во втором let-выражении создается список b, который является вложенным в a. Он начинается с элемента 9 и содержит весь список a.
- Затем с помощью функции format выводится строка
b: ~S~%
, где S заменяется на список b. - После этого с помощью функции setf изменяется второй элемент списка a на 100000.
- И снова выводится строка
b: ~S~%
, где S заменяется на список b.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д