How to detect a special variable
How to detect a special variable
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é
Re: How to detect a special variable
Not with that standard functionality. SBCL has SB-CLTL2:VARIABLE-INFORMATION function, which can check that. For interactive use DESCRIBE will show top level special variables. What is your use case for such information anyway? A naming convention is usually sufficient.
Re: How to detect a special variable
I just want a simple debugging scheme which binds certain data to a top-level special variable if it's set. I know it's not a particularly useful idea, mostly just a quick hack
But now I started to wonder if it's possible.
I guess it's superfluous to check for specialness; if the variable is bound and it's not in lexical scope which the function controls, there are few other possibilities than that it is special.
Does anybody know the corresponding functionality for LispWorks ?
-andré

I guess it's superfluous to check for specialness; if the variable is bound and it's not in lexical scope which the function controls, there are few other possibilities than that it is special.
Does anybody know the corresponding functionality for LispWorks ?
-andré
-
- Posts: 117
- Joined: Tue Aug 10, 2010 11:24 pm
- Location: Calgary, Alberta
- Contact:
Re: How to detect a special variable
Would something like this work?
Code: Select all
(defvar *debug-store* nil)
(defmacro debug-store (value) `(setf *debug-store* ,value))
Need an online wiki database? My Lisp startup http://www.formlis.com combines a wiki with forms and reports.
Re: How to detect a special variable
Since symbol-value() doesn't see lexical variables I think this is the easiest way.
Happy hacking
-andré
Code: Select all
(if (boundp '*debug*)
(setf (symbol-value '*debug*) local-value))
-andré
Re: How to detect a special variable
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.
Re: How to detect a special variable
The PORT package of CLOCC has a function to tell if a symbol is a special variable in sys.lisp:
I'm not sure if this is up-to-date will all the latest implementation internals.
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)))