X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fprimordial-extensions.lisp;h=9edc6d944a3dcfde1cf1f4c98b1e3fc84f916178;hb=670010e3f3dcd62efaf23f61abdc73950edb88c6;hp=83a3e49927c18cb2345059cc3e0a372291a4379c;hpb=b0642df835dc2fca3e4cf47aff978ecdc88799d5;p=sbcl.git diff --git a/src/code/primordial-extensions.lisp b/src/code/primordial-extensions.lisp index 83a3e49..9edc6d9 100644 --- a/src/code/primordial-extensions.lisp +++ b/src/code/primordial-extensions.lisp @@ -121,6 +121,33 @@ (defmacro do-anonymous (varlist endlist &rest body) (frob-do-body varlist endlist body 'let 'psetq 'do-anonymous (gensym))) +;;;; GENSYM tricks + +;;; Automate an idiom often found in macros: +;;; (LET ((FOO (GENSYM "FOO")) +;;; (MAX-INDEX (GENSYM "MAX-INDEX-"))) +;;; ...) +;;; +;;; "Good notation eliminates thought." -- Eric Siggia +;;; +;;; Incidentally, this is essentially the same operator which +;;; _On Lisp_ calls WITH-GENSYMS. +(defmacro with-unique-names (symbols &body body) + `(let ,(mapcar (lambda (symbol) + (let* ((symbol-name (symbol-name symbol)) + (stem (if (every #'alpha-char-p symbol-name) + symbol-name + (concatenate 'string symbol-name "-")))) + `(,symbol (gensym ,stem)))) + symbols) + ,@body)) + +;;; Return a list of N gensyms. (This is a common suboperation in +;;; macros and other code-manipulating code.) +(declaim (ftype (function (index) list) make-gensym-list)) +(defun make-gensym-list (n) + (loop repeat n collect (gensym))) + ;;;; miscellany ;;; Lots of code wants to get to the KEYWORD package or the