Wie erkenne ich, ob eine lexikalische Variable in einem Bereich gebunden ist? Ich möchte grundsätzlich boundp
für lexikalische Variablen.Common Lisp: prüfen, ob eine lexikalische Variable existiert?
Konkret sagen, ich habe:
(defvar *dynamic* 1)
(defconstant +constant+ 2)
(let ((lexical 3))
(when (boundp '*dynamic*) ; t
(print "*dynamic* bound."))
(when (boundp '+constant+) ; t
(print "+constant+ bound."))
(when (boundp 'lexical) ; nil
(print "lexical bound.")))
So boundp
prüft korrekt für dynamische Variablen (und Konstanten) und as the hyperspec says, nicht lexikalische Bindungen abdecken.
Aber ich kann kein Äquivalent von boundp
für lexikalische Bindungen finden. Wie überprüfe ich sie dann? (Implementation-spezifischen Code für sagen SBCL ist in Ordnung, wenn es nichts tragbares gibt.)
Wofür verwenden Sie das? – melpomene
Ich möchte etwas mehr Sicherheit (gegen Tippfehler usw.) für ein Makro bereitstellen, das mit Variablen arbeitet, einschließlich lexikalischer. (Über das hinaus, was der Compiler bereits tut.) 'Boundp' funktioniert für lexikalische Bindungen in Emacs Lisp, also habe ich bereits einen Emacs-Lisp-Code, der auf diese Weise funktioniert, und möchte ihn auf einfachste und unkomplizierte Weise portieren. – stef
(Hoppla, ich war verwirrt über Emacs Lisp: Wenn "lexikalische Bindung" für eine bestimmte Datei wirksam ist, funktioniert "boundp" hier wie in Common Lisp. Es ist nur so selten in meinem Code, ich tat es nicht merke es mir sogar :))) – stef