は(Reddit /r/lisp questionから)このコード例を考える:SBCLは、ローカルバインドされた関数オブジェクトのEQnessを、設定されていなくても変更しますか?
(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*)))
は、上記機能NEXT
を確立します。 LET
の内部では、古い機能をOLD-NEXT
に保存しています。次に、グローバル関数NEXT
をLET
の中に再定義します。
CCL/CMUCL/GCL/ECL/CLISP/LispWorks/ABCL:
* (load "test.lisp")
1 EQ? T
2 EQ? NIL
ローカルの値:
? (load "test.lisp")
1 EQ? T
2 EQ? T
のみSBCL(1.3.11 SBCL)は、異なる結果を有します変数old-next
は、グローバル変数*next*
の値に対して、eq
でなくなりました。
なぜですか?
SBCLのメーリングリストでもお聞きしましたか? – coredump
@coredump:いいえ、まだ –