列出当前在lisp中绑定的全局变量

ben*_*_za 4 lisp global-variables common-lisp

我是Lisp的新手并且想知道:有没有办法列出所有(用户定义的)全局变量?

dan*_*lei 7

一种可能性是检查包的哪个符号是boundp:

(defun user-defined-variables (&optional (package :cl-user))
  (loop with package = (find-package package)
        for symbol being the symbols of package
        when (and (eq (symbol-package symbol) package)
                  (boundp symbol))
          collect symbol))
Run Code Online (Sandbox Code Playgroud)

它返回一个未从另一个包继承的绑定符号列表.

CL-USER> (user-defined-variables)     ; fresh session
NIL
CL-USER> 'foo                         ; intern a symbol
FOO
CL-USER> (defun bar () 'bar)          ; define a function
BAR
CL-USER> (defparameter *baz* 'baz)    ; define a global variable
*BAZ*
CL-USER> (user-defined-variables)
(*BAZ*)                               ; only returns the global variable
Run Code Online (Sandbox Code Playgroud)

  • 几乎:BOUNDP检查绑定,因此它会为动态LET绑定变量返回T,即使可能没有全局值... (2认同)
  • @ben_za Rainer的含义是这样的:`(let((quux'quux))(declare(special quux))(user-defined-variables))`.`user-defined-variables`也会返回`quux`,即使它没有全局声明特殊.(它仍然是用户定义的特殊变量,但不是全局变量.) (2认同)