0.8.10.13:
[sbcl.git] / src / code / early-extensions.lisp
index 065f569..5fb2c0f 100644 (file)
@@ -1097,7 +1097,7 @@ which can be found at <http://sbcl.sourceforge.net/>.~:@>"
                (let ((it ,test)) (declare (ignorable it)),@body)
                (acond ,@rest))))))
 
-;;; (binding* ({(name initial-value [flag])}*) body)
+;;; (binding* ({(names initial-value [flag])}*) body)
 ;;; FLAG may be NIL or :EXIT-IF-NULL
 ;;;
 ;;; This form unites LET*, MULTIPLE-VALUE-BIND and AWHEN.
@@ -1115,7 +1115,15 @@ which can be found at <http://sbcl.sourceforge.net/>.~:@>"
                      (symbol
                       (values (list names) nil))
                      (list
-                      (values names nil)))
+                      (collect ((new-names) (ignorable))
+                        (dolist (name names)
+                          (when (eq name nil)
+                            (setq name (gensym))
+                            (ignorable name))
+                          (new-names name))
+                        (values (new-names)
+                                (when (ignorable)
+                                  `((declare (ignorable ,@(ignorable)))))))))
                  (setq form `(multiple-value-bind ,names
                                  ,initial-value
                                ,@declarations
@@ -1138,3 +1146,31 @@ which can be found at <http://sbcl.sourceforge.net/>.~:@>"
 (defun promise-ready-p (promise)
   (or (not (consp promise))
       (car promise)))
+\f
+;;; toplevel helper
+(defmacro with-rebound-io-syntax (&body body)
+  `(%with-rebound-io-syntax (lambda () ,@body)))
+
+(defun %with-rebound-io-syntax (function)
+  (declare (type function function))
+  (let ((*package* *package*)
+       (*print-array* *print-array*)
+       (*print-base* *print-base*)
+       (*print-case* *print-case*)
+       (*print-circle* *print-circle*)
+       (*print-escape* *print-escape*)
+       (*print-gensym* *print-gensym*)
+       (*print-length* *print-length*)
+       (*print-level* *print-level*)
+       (*print-lines* *print-lines*)
+       (*print-miser-width* *print-miser-width*)
+       (*print-pretty* *print-pretty*)
+       (*print-radix* *print-radix*)
+       (*print-readably* *print-readably*)
+       (*print-right-margin* *print-right-margin*)
+       (*read-base* *read-base*)
+       (*read-default-float-format* *read-default-float-format*)
+       (*read-eval* *read-eval*)
+       (*read-suppress* *read-suppress*)
+       (*readtable* *readtable*))
+    (funcall function)))