From: Christophe R. <cs...@ca...> - 2004-01-31 09:36:50
|
"Robert E. Brown" <bb...@sp...> writes: > The following code: > > (defvar *foo* nil) > (declaim (type (or null function) *foo*)) > > (defun a () (when *foo* (funcall *foo*))) > (defun b () (if *foo* (funcall *foo*))) > (defun c () (and *foo* (funcall *foo*))) > > generates 3 compiler messages, one for each of A, B, and C: > > ; note: unable to > ; optimize away possible call to FDEFINITION at runtime > ; due to type uncertainty: > ; The first argument is a (OR NULL FUNCTION), not a FUNCTION. > > In each case, SBCL fails to deduce that *FOO* can only be invoked when it is > not NIL. I would have guessed that Python's type inferencer could handle > this sort of thing. In a threaded sbcl with a shared binding of *foo*, something can mutate the current binding of *foo* between the test of the conditional and the execution of the FUNCALL. So the type derivation would lead to the consequences of an incorrect declaration -- probably a bus error, in this case, if such a race were to trigger. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |