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

Defsetf and define-setf-method



    Date: Sun, 5 Jan 86 16:23:57 MST
    From: shebs%utah-orion@utah-cs.arpa (Stanley Shebs)

    Recently I had a bright idea concerning the complex form of defsetf and
    define-setf-method, namely that any defsetf could expand into an equivalent
    call on define-setf-method, and that this would be the right thing for
    complex defsetfs.  

That is certainly a reasonable implementation technique and in fact is what I
believe most implementations do.  Actually defsetf and define-setf-method
usually both expand into a third, internal thing.

		       Well, after a few days of screwing around with this,
    I decided that I didn't really understand how a complex defsetf was
    supposed to work, or what its full setf method should look like.  Is it
    all inherently hairy, or is there a simple relation between defsetf and
    define-setf-method that this pea-brained implementor has failed to notice?

When you use define-setf-method you write a lot of calls to gensym, but when
you use defsetf the macro-expansion of defsetf takes care of making the gensyms
itself.  See the discussion on page 103.

Here's an example (Guy, maybe this should go in the manual):

(defsetf subseq (sequence start &optional end) (new-sequence)
  `(progn (replace ,sequence ,new-sequence
		   :start1 ,start :end1 ,end)
	  ,new-sequence))

(define-setf-method subseq (sequence start &optional end)
  (let ((seqtemp (gensym))
	(startemp (gensym))
	(endtemp (gensym))
	(stotemp (gensym)))
    (values (list seqtemp startemp endtemp)
	    (list sequence start end)
	    (list stotemp)
	    `(progn (replace ,seqtemp ,stotemp
			     :start1 ,startemp :end1 ,endtemp)
		    ,stotemp)
	    `(subseq ,seqtemp ,startemp ,endtemp))))