[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

setf order of evaluation

   Date: Wed, 9 Sep 87 14:40 EDT
   From: David A. Moon <franz!STONY-BROOK.SCRC.Symbolics.COM!Moon>

       Date: 9 September 1987, 10:31:51 EDT
       From: Timothy Daly <DALY@ibm.com>


	(setq r '(a 1 b 2 c 3))
	(setq s r)
	(setf (getf r 'b) (progn (setq r nil) 6))

       what is the value of R and S?

       Note that P97 of CLtL states that SETF guarantees the
       left-to-right order of evaluation of its arguments.

       (yes, i know it is crufty to change R).

       Both Symbolics and Lucid seem to generate
	R = (B 8) and S = (A 1 B 2 C 3)

       which implies that the second argument of setf
       is evaluated first. What did I miss?

   It's not a good idea to speak of "arguments" when dealing with
   forms that aren't function calls.  It's less confusing to speak
   of subforms.  The subforms of that setf that get evaluated are

     (progn (setq r nil) 6)

   so I think the behavior you describe is a bug (although the description
   in CLtL is so ambiguous that the implementors of the respective systems
   could easily disagree with me.)

   I didn't look inside the Lucid implementation, but in the Symbolics 
   implementation the source of the bug is that (get-setf-method 'r)
   returns NIL, NIL, (#:G6411), (SETQ R #:G6411), R, whereas it should
   return (#:G6410), (R), (#:G6411), (SETQ R #:G6411), #:G6410.  See
   CLtL page 104 for the description of the meaning of these values.

   Changing it to return the latter makes your SETF example behave as you
   expected, evaluating R -before- bashing it, and setq'ing it to the updated
   property list -after- setq'ing it to nil.

Franz Inc.'s Common Lisp ("Allegro CL") ends up with r = nil and
s = (a 1 b 6 c 3).  However, it returns the same 5 forms for
(get-setf-method 'r) that Symbolics does, and in fact these 5 forms
are given as an example on p. 105 of CLtL.