home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / languages / elisp / packages / MouseAndMenuEmacs / gensym.el < prev    next >
Encoding:
Text File  |  1990-05-31  |  1.1 KB  |  33 lines

  1. ;;;; Russell Ritchie, Scottish HCI Centre, <russell@uk.ac.strath.hci>.
  2. ;;;; Tue Aug 23 17:02:57 1988
  3. ;;;; Gensym for Emacs Lisp. If you don't know what it is, you don't need it.
  4.  
  5. (provide 'gensym)
  6.  
  7. ;;; Oh, for the want of closures.
  8.  
  9. (defvar gensym-string-index-alist nil "Where gensym hides its dirty deeds.")
  10.  
  11. (defun gensym (&optional prefix)
  12.   "Return a unique symbol with (optional) string or symbol prefix, e.g.
  13.     (gensym) => a02886-1
  14.     (gensym) => a02886-2
  15.     (gensym \"foo\") => foo-1
  16.     (progn (setq foo-2 nil) (gensym \"foo\")) => foo-3
  17.     (gensym 'bar) => bar-1
  18. Will not clobber any existing symbol. 
  19. Functional? Of course it's not functional."
  20.   (let* ((prefix (or prefix (make-temp-name "")))
  21.      (last-index (assoc prefix gensym-string-index-alist))
  22.      (gensym-index (if last-index (cdr last-index) 1))
  23.      (symbol (format "%s-%d" prefix gensym-index)))
  24.     (while (intern-soft symbol)
  25.       (setq gensym-index (1+ gensym-index)
  26.         symbol (format "%s-%d" prefix gensym-index)))
  27.     (setq gensym-string-index-alist
  28.       (cons (cons prefix gensym-index)
  29.         (delq last-index gensym-string-index-alist)))
  30.     (intern symbol)))
  31.  
  32.  
  33.