X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fprimordial-extensions.lisp;h=4f259760e5190fe9a23a0e8c081e535c1038bf5e;hb=f1407e424f1063203af07d2e61ceef58515a4797;hp=83a3e49927c18cb2345059cc3e0a372291a4379c;hpb=b0642df835dc2fca3e4cf47aff978ecdc88799d5;p=sbcl.git diff --git a/src/code/primordial-extensions.lisp b/src/code/primordial-extensions.lisp index 83a3e49..4f25976 100644 --- a/src/code/primordial-extensions.lisp +++ b/src/code/primordial-extensions.lisp @@ -57,7 +57,7 @@ ;;;; DO-related stuff which needs to be visible on the cross-compilation host -(eval-when (:compile-toplevel :load-toplevel :execute) +(eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute) (defun frob-do-body (varlist endlist decls-and-code bind step name block) (let* ((r-inits nil) ; accumulator for reversed list (r-steps nil) ; accumulator for reversed list @@ -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 @@ -137,7 +164,7 @@ ;;; Concatenate together the names of some strings and symbols, ;;; producing a symbol in the current package. -(eval-when (:compile-toplevel :load-toplevel :execute) +(eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute) (defun symbolicate (&rest things) (let ((name (case (length things) ;; why isn't this just the value in the T branch?