LINUX.ORG.RU

Изменение переменной, определенной в let

 


0

1

Я ожидаю, что каждый вызов 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

Ответ на: комментарий от dr_jumba

Т.е. получается что он каждый раз не создает заново список, а оптимизирует и использует определенное ранее quoted выражение.

dr_jumba
() автор топика
Ответ на: комментарий от dr_jumba

Это не оптимизация. Закавыченные выражения создаются один раз при чтении. (list 1 1) будет создавать список каждый раз при выполнении.

naryl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.