Given this code example (from the Reddit / r / lisp question ):
(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*)))
The NEXT function is set above. Inside LET we store the old function in OLD-NEXT . Then we will redefine the global function NEXT inside LET .
BKK / CMUCL / VKT / ECL / CLISP / LispWorks / ABCL:
? (load "test.lisp") 1 EQ? T 2 EQ? T
Only SBCL (SBCL 1.3.11) has a different result:
* (load "test.lisp") 1 EQ? T 2 EQ? NIL
The value of the local variable OLD-NEXT no longer eq for the value of the global variable *next* .
Why???
common-lisp sbcl ansi-common-lisp
Rainer joswig
source share