X-Git-Url: https://git.distorted.org.uk/~mdw/lisp/blobdiff_plain/e96e008d5962bdbf73e16350a3880983857e87a4..e2a3c9236277551b174d522db7161c4eec29f97f:/mdw-base.lisp diff --git a/mdw-base.lisp b/mdw-base.lisp index 6b235f5..269b398 100644 --- a/mdw-base.lisp +++ b/mdw-base.lisp @@ -105,24 +105,24 @@ structure definitions without doom ensuing." (error "No initializer for slot.")) -(compile-time-defun parse-body (body) +(compile-time-defun parse-body (body &key (allow-docstring-p t)) "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))))) + using `@,'. If ALLOW-DOCSTRING-P is nil, docstrings aren't allowed at + all." + (let ((doc nil) (decls nil)) + (do ((forms body (cdr forms))) (nil) + (let ((form (and forms (car forms)))) + (cond ((and allow-docstring-p (not doc) (stringp form) (cdr forms)) + (setf doc form)) + ((and (consp form) + (eq (car form) 'declare)) + (setf decls (append decls (cdr form)))) + (t (return (values (and doc (list doc)) + (and decls (list (cons 'declare decls))) + forms)))))))) ;;;-------------------------------------------------------------------------- ;;; Generating symbols.