X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fsymbol.lisp;h=fe29dd6bc17f0a453cb7e44956bc34271bc66f1b;hb=20db73fc9412b7d9bd92f93239d7f34a261d5402;hp=2ef5dc58b82be64b620d076ca40222f748c7c207;hpb=8dbc4249380e18a193f4e79306bd958cd88ad9aa;p=sbcl.git diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index 2ef5dc5..fe29dd6 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -32,20 +32,37 @@ #!+sb-doc "Set SYMBOL's value cell to NEW-VALUE." (declare (type symbol symbol)) - (about-to-modify-symbol-value symbol) + (about-to-modify-symbol-value symbol 'set new-value) (%set-symbol-value symbol new-value)) (defun %set-symbol-value (symbol new-value) (%set-symbol-value symbol new-value)) +(defun symbol-global-value (symbol) + #!+sb-doc + "Return the SYMBOL's current global value. Identical to SYMBOL-VALUE, +in single-threaded builds: in multithreaded builds bound values are +distinct from the global value. Can also be SETF." + (declare (optimize (safety 1))) + (symbol-global-value symbol)) + +(defun set-symbol-global-value (symbol new-value) + (about-to-modify-symbol-value symbol 'set new-value) + (sb!kernel:%set-symbol-global-value symbol new-value)) + +(declaim (inline %makunbound)) +(defun %makunbound (symbol) + (%set-symbol-value symbol (%primitive sb!c:make-other-immediate-type + 0 sb!vm:unbound-marker-widetag))) + (defun makunbound (symbol) #!+sb-doc "Make SYMBOL unbound, removing any value it may currently have." (with-single-package-locked-error (:symbol symbol "unbinding the symbol ~A") - (set symbol - (%primitive sb!c:make-other-immediate-type - 0 - sb!vm:unbound-marker-widetag)) + (when (and (info :variable :always-bound symbol)) + (error "Can't make ~A variable unbound: ~S" 'always-bound symbol)) + (about-to-modify-symbol-value symbol 'makunbound) + (%makunbound symbol) symbol)) ;;; Return the built-in hash value for SYMBOL. @@ -88,7 +105,10 @@ (defun make-symbol (string) #!+sb-doc "Make and return a new symbol with the STRING as its print name." - (make-symbol string)) + (declare (type string string)) + (%make-symbol (if (simple-string-p string) + string + (subseq string 0)))) (defun get (symbol indicator &optional (default nil)) #!+sb-doc @@ -113,13 +133,13 @@ (defun get3 (symbol indicator default) (let (cdr-pl) (do ((pl (symbol-plist symbol) (cdr cdr-pl))) - ((atom pl) default) + ((atom pl) default) (setq cdr-pl (cdr pl)) (cond ((atom cdr-pl) - (error "~S has an odd number of items in its property list." - symbol)) - ((eq (car pl) indicator) - (return (car cdr-pl))))))) + (error "~S has an odd number of items in its property list." + symbol)) + ((eq (car pl) indicator) + (return (car cdr-pl))))))) (defun %put (symbol indicator value) #!+sb-doc @@ -226,6 +246,11 @@ ;;;; 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") @@ -244,7 +269,7 @@ (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 @@ -252,10 +277,7 @@ (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*)) @@ -264,11 +286,6 @@ #!+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)))))