(defun getf (place indicator &optional (default ()))
#!+sb-doc
- "Search the property list stored in Place for an indicator EQ to INDICATOR.
+ "Search the property list stored in PLACE for an indicator EQ to INDICATOR.
If one is found, return the corresponding value, else return DEFAULT."
(do ((plist place (cddr plist)))
((null plist) default)
\f
;;;; GENSYM and friends
+(defun %make-symbol-name (prefix counter)
+ (with-output-to-string (s)
+ (write-string prefix s)
+ (%output-integer-in-base counter 10 s)))
+
(defvar *gensym-counter* 0
#!+sb-doc
"counter for generating unique GENSYM symbols")
(let ((new (etypecase old
(index (1+ old))
(unsigned-byte (1+ old)))))
- (declare (optimize (speed 3) (safety 0)(inhibit-warnings 3)))
+ (declare (optimize (speed 3) (safety 0) (inhibit-warnings 3)))
(setq *gensym-counter* new)))
(multiple-value-bind (prefix int)
(etypecase thing
(fixnum (values "G" thing))
(string (values (coerce thing 'simple-string) old)))
(declare (simple-string prefix))
- (make-symbol
- (concatenate 'simple-string prefix
- (the simple-string
- (quick-integer-to-string int)))))))
+ (make-symbol (%make-symbol-name prefix int)))))
(defvar *gentemp-counter* 0)
(declaim (type unsigned-byte *gentemp-counter*))
#!+sb-doc
"Creates a new symbol interned in package PACKAGE with the given PREFIX."
(declare (type string prefix))
- (loop
- (let ((*print-base* 10)
- (*print-radix* nil)
- (*print-pretty* nil)
- (new-pname (format nil "~A~D" prefix (incf *gentemp-counter*))))
- (multiple-value-bind (symbol existsp) (find-symbol new-pname package)
- (declare (ignore symbol))
- (unless existsp (return (values (intern new-pname package))))))))
+ (loop for name = (%make-symbol-name prefix (incf *gentemp-counter*))
+ while (nth-value 1 (find-symbol name package))
+ finally (return (values (intern name package)))))