[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
setf order of evaluation
    Date: Thu, 10 Sep 87 23:13 EDT
    From: Kent M Pitman <KMP@STONY-BROOK.SCRC.Symbolics.COM>
[philosophy for future languages deleted]
    As food for thought, consider the following examples...
     ;; #1: The case in question (using a variable as a place)
     (PROGN (SETQ R '(A 1 B 2 C 3))
	    (SETQ S R)
	    (SETF (GETF R 'B) (PROGN (SETQ R NIL) 6))
	    (VALUES R S))
     ;; #2: The case in question (using a non-variable as a place)
     (PROGN (SETQ R '(A 1 B 2 C 3))
	    (SETQ S R)
	    (SETF (GETF (NTHCDR 2 R) 'B) (PROGN (SETQ R NIL) 6))
	    (VALUES R S))
Definitely an illuminating case.  This blows up trying to RPLACD NIL
with the get-setf-method of variables prescribed by CLtL, but does
what one would expect with the get-setf-method of variables I suggested
the other day.  Also illuminating:
;; #2a: doesn't use GETF at all
(PROGN (SETQ R '(A 1 B 2 C 3))
       (SETQ S R)
       (SETF (NTHCDR 2 R) (PROGN (SETQ R NIL) 6))
       (VALUES R S))
which again blows up with CLtL's setf-method for variables, but does
what one would expect with the one I suggested.  These two examples
changed my mind; now I think the one I suggested is obviously right,
and the one in CLtL, evidently used by Symbolics and Lucid (and no
doubt other implementations) is obviously wrong.
     ;; #3: This can't work, but think hard about why not.
Works fine for me, and returns the same values as #1.
     ;;     There's a sense in which it feels like it ought to be identical
     ;;     to #1 above.
     (PROGN (SETQ R '(A 1 B 2 C 3))
	    (SETQ S R)
	    (SETF (GETF (NTHCDR 0 R) 'B) (PROGN (SETQ R NIL) 6))
	    (VALUES R S))
     ;; #4: This is not as much like the others, but I found its return
     ;;     value to be instructive anyway.
     (PROGN (SETQ R '(A 1 B 2 C 3))
	    (SETQ S R)
	    (SETF (CAR R) (PROGN (SETQ R NIL) 6))
	    (VALUES R S))
Nothing surprising here.