Page 1 of 1

How to detect a special variable

Posted: Mon Jan 24, 2011 4:59 am
by sinnatagg
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é

Re: How to detect a special variable

Posted: Mon Jan 24, 2011 5:25 am
by ramarren
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

Posted: Mon Jan 24, 2011 1:07 pm
by sinnatagg
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 :D 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é

Re: How to detect a special variable

Posted: Mon Jan 24, 2011 1:55 pm
by Warren Wilkinson
Would something like this work?

Code: Select all

(defvar *debug-store* nil)
(defmacro debug-store (value) `(setf *debug-store* ,value))

Re: How to detect a special variable

Posted: Mon Jan 24, 2011 2:04 pm
by sinnatagg
Since symbol-value() doesn't see lexical variables I think this is the easiest way.

Code: Select all

(if (boundp '*debug*)
  (setf (symbol-value '*debug*) local-value))
Happy hacking

-andré

Re: How to detect a special variable

Posted: Mon Jan 24, 2011 11:32 pm
by ramarren
sinnatagg wrote:Since symbol-value() doesn't see lexical variables I think this is the easiest way.
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.

Re: How to detect a special variable

Posted: Tue Jan 25, 2011 9:45 pm
by vsedach
The PORT package of CLOCC has a function to tell if a symbol is a special variable in sys.lisp:

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)))
I'm not sure if this is up-to-date will all the latest implementation internals.