Изменение переменной, определенной в let
Я ожидаю, что каждый вызов test1 будет возвращать (2 1).
- Так не делают и вместо изменения val1 нужно определять новую переменную?
- Почему так происходит c test1?
- Почему sbcl ругается?
- Почему test2 возвращает всегда 1?
; test1.lisp
(defun test1 ()
(let ((val1 '(1 1)))
(incf (car val1))
(princ val1)))
(test1)
(test1)
; test2.lisp
(defun test2 ()
(let ((val1 0))
(incf val1)
(princ val1)))
(test2)
(test2)
> clisp test1.lisp
(2 1)(3 1)
> ecl -shell test1.lisp
(2 1)(3 1)
> sbcl --script test1.lisp
; ...
; WARNING: Destructive function SB-KERNEL:%RPLACA called on constant data.
; ...
(2 1)(2 1)
> clisp test2.lisp
11