From: Christophe R. <cs...@ca...> - 2006-12-13 18:08:01
|
"Attila Lendvai" <att...@gm...> writes: > (let ((y)) > (declare (type list y) > (special y) > (optimize speed)) > (length y)) > > it compiles with notes that the type of y is not certain. when > commenting out the (special y) declaration there are no notes, so the > type annotation seems to be processed in that case. In this very particular case, there may be no need for a note. However, in general, special declarations inhibit type propagation and inference because they can be shared between threads, and their values changed by other threads. To alter your example slightly: (defun foo () (declare (type list y) (special y) (optimize speed)) (length y)) In this situation, between performing a typecheck for LIST on Y and taking the length, another thread could do (setf (symbol-value 'y) #()) and then if the call to LENGTH has been compiled to a list-specific version, your lisp will segfault or corrupt the heap. If you need some kind of fast behaviour, then I suggest you bind the value of your special to a lexical variable; because then changes to the value of the special don't affect the remainder of the body. For example: (let ((y)) (declare (special y) (optimize speed)) (let ((yy y)) (declare (type list yy)) (length yy))) Best, Christophe |