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-выражения.

  1. В первом let-выражении создается список a с тремя элементами: 1, 2, 3.
  2. Во втором let-выражении создается список b, который является вложенным в a. Он начинается с элемента 9 и содержит весь список a.
  3. Затем с помощью функции format выводится строка b: ~S~%, где S заменяется на список b.
  4. После этого с помощью функции setf изменяется второй элемент списка a на 100000.
  5. И снова выводится строка b: ~S~%, где S заменяется на список b.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы