X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fearly-setf.lisp;h=e829b6a5a70025200053c2cf3fc57e1494e7ca98;hb=b36697e233ff1ef1cc3ad2e687581520656d4755;hp=5727b61c74d420ac3cb247667479da68078fc29a;hpb=7d33841eaefb309885a4f5fe23f6d6870f66d242;p=sbcl.git diff --git a/src/code/early-setf.lisp b/src/code/early-setf.lisp index 5727b61..e829b6a 100644 --- a/src/code/early-setf.lisp +++ b/src/code/early-setf.lisp @@ -257,8 +257,9 @@ GET-SETF-EXPANSION directly." (local1 (gensym)) (local2 (gensym))) ((null d) - (push (list (car newval) getter) let-list) + ;; See ANSI 5.1.3 for why we do out-of-order evaluation (push (list ind-temp indicator) let-list) + (push (list (car newval) getter) let-list) `(let* ,(nreverse let-list) (do ((,local1 ,(car newval) (cddr ,local1)) (,local2 nil ,local1)) @@ -273,6 +274,31 @@ GET-SETF-EXPANSION directly." ,setter (return t)))))))) (push (list (car d) (car v)) let-list)))) + +;;; we can't use DEFINE-MODIFY-MACRO because of ANSI 5.1.3 +(defmacro-mundanely incf (place &optional (delta 1) &environment env) + #!+sb-doc + "The first argument is some location holding a number. This number is + incremented by the second argument, DELTA, which defaults to 1." + (multiple-value-bind (dummies vals newval setter getter) + (get-setf-method place env) + (let ((d (gensym))) + `(let* (,@(mapcar #'list dummies vals) + (,d ,delta) + (,(car newval) (+ ,getter ,d))) + ,setter)))) + +(defmacro-mundanely decf (place &optional (delta 1) &environment env) + #!+sb-doc + "The first argument is some location holding a number. This number is + decremented by the second argument, DELTA, which defaults to 1." + (multiple-value-bind (dummies vals newval setter getter) + (get-setf-method place env) + (let ((d (gensym))) + `(let* (,@(mapcar #'list dummies vals) + (,d ,delta) + (,(car newval) (- ,getter ,d))) + ,setter)))) ;;;; DEFINE-MODIFY-MACRO stuff @@ -321,16 +347,6 @@ GET-SETF-EXPANSION directly." let-list) `(let* ,(nreverse let-list) ,setter))))))) - -(sb!xc:define-modify-macro incf (&optional (delta 1)) + - #!+sb-doc - "The first argument is some location holding a number. This number is - incremented by the second argument, DELTA, which defaults to 1.") - -(sb!xc:define-modify-macro decf (&optional (delta 1)) - - #!+sb-doc - "The first argument is some location holding a number. This number is - decremented by the second argument, DELTA, which defaults to 1.") ;;;; DEFSETF