COMPILE regression in Apr 2010 snapshot (?)

Raymond Toy toy.raymond at gmail.com
Mon Apr 26 16:08:27 CEST 2010


On 4/25/10 11:29 PM, Raymond Toy wrote:
> On 4/24/10 3:42 AM, Madhu wrote:
>> Helu, here is an unpolished test case to show the problem:
>>
>>   -=-=-
>> (defmacro frob-keyvals-string (string)
>>   (with-input-from-string (stream string)
>>     `(progn ,@(loop for key = (let ((x (read stream nil stream)))
>> 				(if (eq x stream) (loop-finish) x))
>> 		    for val = (read stream)
>> 		    for comment = (read stream)
>> 		    collect (list 'defvar key (list 'quote val)
>> 				  (string comment))))))
>>
>> (frob-keyvals-string "
>> foo fooval foocomment
>> bar barval barcomment
>> car carval carcomment")
>>   
> This is caused by the macro expansion of defvar when the localization
> support was added.  Previously, we had
> 
> (macroexpand '(defvar abc nil "abc")) ->
> (PROGN
>   (DECLAIM (SPECIAL ABC))
>   (UNLESS (BOUNDP 'ABC)
>     (SETQ ABC NIL))
>   (SETF (DOCUMENTATION 'ABC 'VARIABLE) '"abc")
>   (LISP::SET-DEFVAR-SOURCE-LOCATION 'ABC (C::SOURCE-LOCATION))
>   'ABC)
> 
> We now have:
> 
> (PROGN
>   (DECLAIM (SPECIAL ABC))
>   (UNLESS (BOUNDP 'ABC)
>     (SETQ ABC NIL))
>   (SETF (DOCUMENTATION 'ABC 'VARIABLE) '"abc")
>   (EVAL-WHEN (:LOAD-TOPLEVEL :EXECUTE)
>     (SETF (INFO VARIABLE INTL:TEXTDOMAIN 'ABC) NIL))
>   (LISP::SET-DEFVAR-SOURCE-LOCATION 'ABC (C::SOURCE-LOCATION))
>   'ABC)
> 
> I do not understand it, but that (setf info) causes the problem.  When
> that is removed, cmucl behaves as it used to.  I don't understand why
> that would cause the macro to be compiled again.

To confuse me even more, if defvar macroexpands to

(PROGN
  (DECLAIM (SPECIAL ABC))
  (UNLESS (BOUNDP 'ABC)
    (SETQ ABC NIL))
  (SETF (DOCUMENTATION 'ABC 'VARIABLE) '"abc")
  (EVAL-WHEN (:LOAD-TOPLEVEL :EXECUTE)
    (%%defvar 'abc "domain"))
  (LISP::SET-DEFVAR-SOURCE-LOCATION 'ABC (C::SOURCE-LOCATION))
  'ABC)

Everything looks as it used to.

Ray



More information about the cmucl-imp mailing list