【发布时间】:2016-06-05 15:53:19
【问题描述】:
如何检测词法变量是否绑定在范围内?我基本上想要boundp 作为词法变量。
具体来说,说我有:
(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.")))
所以boundp 正确检查动态变量(和常量),而as the hyperspec says 不包括词法绑定。
但我找不到任何与 boundp 等效的词法绑定。那么我该如何检查它们呢? (如果没有任何可移植的东西,那么 SBCL 的实现特定代码就可以了。)
【问题讨论】:
-
你打算用它做什么?
-
我想为对变量(包括词法变量)进行操作的宏提供一些额外的安全性(防止拼写错误等)。 (超出了编译器已经做的事情。)
boundp用于 Emacs Lisp 中的词法绑定,所以我已经有一些 Emacs Lisp 代码可以以这种方式工作,并希望以最简单直接的方式移植它。 -
(哎呀,我对 Emacs Lisp 感到困惑:如果
lexical-binding对给定文件有效,boundp就像在 Common Lisp 中一样工作。它在我的代码中很少有效,我什至没有注意到。:))
标签: scope common-lisp