the heap and certainly confuses the world if that string is used by
C code.
-316: "SHIFTF and multiple values"
- reported by Bruno Haible sbcl-devel "various SBCL bugs" from CLISP
- test suite.
- (shiftf (values x y) (values y x))
- gives an error in sbcl-0.8.10.
-
- Parts of the explanation of SHIFTF in ANSI CL talk about multiple
- store variables, and the X3J13 vote
- SETF-MULTIPLE-STORE-VARIABLES:ALLOW also says that SHIFTF should
- support multiple value places.
-
317: "FORMAT of floating point numbers"
reported by Bruno Haible sbcl-devel "various SBCL bugs" from CLISP
test suite.
(vector-push-extend (list 'string p1 p2) s))
(:method ((p1 t) (p2 t) s) (vector-push-extend (list t p1 p2) s)))
-322: "DEFSTRUCT :TYPE LIST predicate and improper lists"
- (fixed in sbcl-0.8.10.23)
-
323: "REPLACE, BIT-BASH and large strings"
The transform for REPLACE on simple-base-strings uses BIT-BASH, which
at present has an upper limit in size. Consequently, in sbcl-0.8.10
returning the value of the leftmost."
(when (< (length args) 2)
(error "~S called with too few arguments: ~S" 'shiftf form))
- (let ((resultvar (gensym)))
- (do ((arglist args (cdr arglist))
- (bindlist nil)
- (storelist nil)
- (lastvar resultvar))
- ((atom (cdr arglist))
- (push `(,lastvar ,(first arglist)) bindlist)
- `(let* ,(nreverse bindlist) ,@(nreverse storelist) ,resultvar))
- (multiple-value-bind (sm1 sm2 sm3 sm4 sm5)
- (get-setf-method (first arglist) env)
- (mapc (lambda (var val)
- (push `(,var ,val) bindlist))
- sm1
- sm2)
- (push `(,lastvar ,sm5) bindlist)
- (push sm4 storelist)
- (setq lastvar (first sm3))))))
+ (let (let*-bindings mv-bindings setters getters)
+ (dolist (arg (butlast args))
+ (multiple-value-bind (temps subforms store-vars setter getter)
+ (sb!xc:get-setf-expansion arg env)
+ (mapc (lambda (tmp form)
+ (push `(,tmp ,form) let*-bindings))
+ temps
+ subforms)
+ (push store-vars mv-bindings)
+ (push setter setters)
+ (push getter getters)))
+ ;; Handle the last arg specially here. The getter is just the last
+ ;; arg itself.
+ (push (car (last args)) getters)
+
+ ;; Reverse the collected lists so last bit looks nicer.
+ (setf let*-bindings (nreverse let*-bindings)
+ mv-bindings (nreverse mv-bindings)
+ setters (nreverse setters)
+ getters (nreverse getters))
+
+ (labels ((thunk (mv-bindings getters)
+ (if mv-bindings
+ `((multiple-value-bind
+ ,(car mv-bindings)
+ ,(car getters)
+ ,@(thunk (cdr mv-bindings) (cdr getters))))
+ `(,@setters))))
+ `(let ,let*-bindings
+ (multiple-value-bind ,(car mv-bindings)
+ ,(car getters)
+ ,@(thunk mv-bindings (cdr getters))
+ (values ,@(car mv-bindings)))))))
(defmacro-mundanely push (obj place &environment env)
#!+sb-doc