Update of /project/cl-utilities/cvsroot/cl-utilities In directory common-lisp.net:/tmp/cvs-serv3083
Modified Files: once-only.lisp Log Message: Factored out error checking
Date: Thu May 26 21:09:05 2005 Author: pscott
Index: cl-utilities/once-only.lisp diff -u cl-utilities/once-only.lisp:1.1.1.1 cl-utilities/once-only.lisp:1.2 --- cl-utilities/once-only.lisp:1.1.1.1 Mon May 9 23:26:29 2005 +++ cl-utilities/once-only.lisp Thu May 26 21:09:05 2005 @@ -7,11 +7,18 @@
(in-package :cl-utilities)
-(defmacro once-only ((&rest names) &body body) - ;; Check that all of the NAMES are symbols. If not, raise an error. +(defun check-once-only-names (names) + "Check that all of the NAMES are symbols. If not, raise an error." + ;; This only raises an error for the first non-symbol argument + ;; found. While this won't report multiple errors, it is probably + ;; more convenient to only report one. (let ((bad-name (find-if-not #'symbolp names))) (when bad-name - (error "ONCE-ONLY expected a symbol but got ~S" bad-name))) + (error "ONCE-ONLY expected a symbol but got ~S" bad-name)))) + +(defmacro once-only (names &body body) + ;; Check the NAMES list for validity. + (check-once-only-names names) ;; Do not touch this code unless you really know what you're doing. (let ((gensyms (loop for name in names collect (gensym (string name))))) `(let (,@(loop for g in gensyms