Я новичок в Emacs lisp, так что это действительно нубский вопрос. Допустим, мне нужно написать функцию, которая использует al oop для добавления 1 к каждому элементу вектора цифр c.
Вот код, который я написал (комментарии указывают, что я пытается делать на каждом шаге):
(defun add-one (x)
"Use a loop to add 1 to each element of list X"
(let* ((res x) ; make a copy of X
(counter 0)) ; set counter to 0
(while (< counter (length x))
;; Replace each element of RES by adding 1:
(setcar (nthcdr counter res) (1+ (car (nthcdr counter x))))
(setq counter (1+ counter)))
;; Display result:
(message "%s" res)))
Но мой код кажется разрушительным для x
, так как несколько вызовов функции не дают один и тот же результат:
;; Define a list:
(setq mylist '(1 2 3 4))
;; Several calls to the function:
(add-one mylist) ; -> (2 3 4 5)
(add-one mylist) ; -> (3 4 5 6)
Вот мой вопрос: я не понимаю, почему мой код разрушителен (я ожидал, что результат будет (2 3 4 5)
при каждом выполнении). Я знаю, что setcar
разрушителен, но он применяется к копии x
, а не к x
. Так почему же меняется результат?
Спасибо!