(:use #:common-lisp)
(:export #:compile-time-defun
#:show
- #:stringify #:listify #:fix-pair #:pairify
+ #:stringify #:listify #:fix-pair #:pairify #:parse-body
#:whitespace-char-p
#:slot-uninitialized
#:nlet #:while #:case2 #:ecase2
structure definitions without doom ensuing."
(error "No initializer for slot."))
+(compile-time-defun parse-body (body)
+ "Given a BODY (a list of forms), parses it into three sections: a
+docstring, a list of declarations (forms beginning with the symbol `declare')
+and the body forms. The result is returned as three lists (even the
+docstring), suitable for interpolation into a backquoted list using `@,'."
+ (multiple-value-bind
+ (doc body)
+ (if (and (consp body)
+ (stringp (car body)))
+ (values (list (car body)) (cdr body))
+ (values nil body))
+ (loop for forms on body
+ for form = (car forms)
+ while (and (consp form)
+ (eq (car form) 'declare))
+ collect form into decls
+ finally (return (values doc decls forms)))))
+
;;;--------------------------------------------------------------------------
;;; Generating symbols.