DEFSTRUCT forms are now created eagerly.
* bug fix: lambda-list parsing is now stricter vrt. order and number
of lambda-list keywords.
+ * fixed some bugs revealed by Paul Dietz' test suite:
+ ** INCF, DECF and REMF evaluate their place form as specified in
+ CLtS 5.1.3.
changes in sbcl-0.8.17 relative to sbcl-0.8.16:
* new feature: a build-time option (controlled by the :SB-UNICODE
(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))
,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))))
\f
;;;; DEFINE-MODIFY-MACRO stuff
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.")
\f
;;;; DEFSETF