Merge branch 'master' of /home/mdw/public-git/lisp
authorMark Wooding <mdw@distorted.org.uk>
Sat, 27 Jan 2007 16:33:40 +0000 (16:33 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 27 Jan 2007 16:33:40 +0000 (16:33 +0000)
* 'master' of /home/mdw/public-git/lisp:
  base: with-parsed-body, different interface.
  collect: Provide functional interface for collectors.

1  2 
mdw-base.lisp

diff --combined mdw-base.lisp
@@@ -31,7 -31,8 +31,8 @@@
    (:export #:unsigned-fixnum
           #:compile-time-defun
           #:show
-          #:stringify #:mappend #:listify #:fix-pair #:pairify #:parse-body
+          #:stringify #:mappend #:listify #:fix-pair #:pairify
+          #:parse-body #:with-parsed-body
           #:whitespace-char-p
           #:slot-uninitialized
           #:nlet #:while #:until #:case2 #:ecase2 #:setf-default
@@@ -80,7 -81,8 +81,7 @@@
    (typecase str
      (string str)
      (symbol (symbol-name str))
 -    (t (with-output-to-string (s)
 -       (princ str s)))))
 +    (t (princ-to-string str))))
  
  (defun mappend (function list &rest more-lists)
    "Apply FUNCTION to corresponding elements of LIST and MORE-LISTS, yielding
  (defun whitespace-char-p (ch)
    "Return whether CH is a whitespace character or not."
    (case ch
 -    ((#\space #\tab #\newline #\return #\vt
 -            #+cmu #\formfeed
 -            #+clisp #\page) t)
 +    (#.(loop for i below char-code-limit
 +           for ch = (code-char i)
 +           unless (with-input-from-string (in (string ch))
 +                    (peek-char t in nil))
 +           collect ch)
 +       t)
      (t nil)))
  
  (declaim (ftype (function nil ()) slot-unitialized))
                                 (and decls (list (cons 'declare decls)))
                                 forms))))))))
  
+ (defmacro with-parsed-body
+     ((bodyvar declvar &optional (docvar (gensym) docp)) form &body body)
+   "Parse FORM into a body, declarations and (maybe) a docstring; bind BODYVAR
+    to the body, DECLVAR to the declarations, and DOCVAR to (a list
+    containing) the docstring, and evaluate BODY."
+   `(multiple-value-bind
+        (,docvar ,declvar ,bodyvar)
+        (parse-body ,form :allow-docstring-p ,docp)
+      ,@(if docp nil `((declare (ignore ,docvar))))
+      ,@body))
  #-cmu
  (progn
    (declaim (inline fixnump))