X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fsymbol.lisp;h=c95370fa7753ac1dcd764e1183d7fa08b194e8fe;hb=9837343101c3da7b3a8f94609ec116ec5025436a;hp=f4a7888042bf53641be6d75737a7e0f23d537444;hpb=62b6c13eaaefa20b790e10a28d292e1821cd4446;p=sbcl.git diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index f4a7888..c95370f 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.