How to detect a special variable
Posted: Mon Jan 24, 2011 4:59 am
You can find out if a symbol is bound to a variable with boundp(), but is it possible to detect if the variable is bound in special scope ?
-andré
-andré
Discuss and learn Lisp programming of all dialects. NOTICE: Site locked. No new users or posts.
http://www.lispforum.com/
Code: Select all
(defvar *debug-store* nil)
(defmacro debug-store (value) `(setf *debug-store* ,value))
Code: Select all
(if (boundp '*debug*)
(setf (symbol-value '*debug*) local-value))
BOUNDP doesn't see lexical variables either, see the note at the end of the Hyperspec entry. This has to be so, because it is a function, and lexical bindings names can be removed at run-time and replaced with direct memory accesses as an optimization during compilation, which is why checking lexical variables information by name requires additional compiler/interpreter support.sinnatagg wrote:Since symbol-value() doesn't see lexical variables I think this is the easiest way.
Code: Select all
(defun variable-special-p (symbol)
"Return T if the symbol names a global special variable."
#+(and allegro (not (version>= 6))) (clos::variable-special-p symbol nil)
#+(and allegro (version>= 6)) (excl::variable-special-p symbol nil)
#+clisp (sys::special-variable-p symbol)
#+cmu (walker:variable-globally-special-p symbol)
#+gcl (si:specialp symbol)
#+lispworks (eq :special (hcl:variable-information symbol))
#+lucid (system:proclaimed-special-p symbol)
#+sbcl (sb-walker:var-globally-special-p symbol)
#-(or allegro clisp cmu gcl lispworks lucid sbcl)
(error 'not-implemented :proc (list 'variable-special-p symbol)))