Biorąc pod uwagę ten przykładowy kod (ze Reddit /r/lisp question):SBCL zmienia EQness lokalnego obiektu funkcji granicy, nawet jeśli nie jest ustawiony?
(defun next (pos)
(nth (1+ pos)
'(0 1 2 3 4 5 6 7 8 9 10)))
(defvar *next* (function next))
(let ((old-next #'next)
(previous (make-hash-table)))
(format t "~% 1 EQ? ~a" (eq old-next *next*))
(defun next (pos)
(or (gethash pos previous)
(setf (gethash pos previous) (funcall old-next pos))))
(format t "~% 2 EQ? ~a" (eq old-next *next*)))
Przede ustanawia funkcję NEXT
. Wewnątrz LET
zachowujemy starą funkcję w OLD-NEXT
. Następnie redefiniujemy globalną funkcję NEXT
wewnątrz LET
.
CCL/CMUCL/GCL/ECL/clisp/LispWorks/ABCL:
? (load "test.lisp")
1 EQ? T
2 EQ? T
Tylko SBCL (SBCL 1.3.11) ma inny wynik:
* (load "test.lisp")
1 EQ? T
2 EQ? NIL
Wartość lokalny zmienna old-next
nie jest już wartością zmiennej globalnej eq
.
Dlaczego ???
Czy pytałeś również o listę mailingową SBCL? – coredump
@coredump: nie, jeszcze nie –