在Emacs Lisp中,如何检查变量是否已定义?

110

在Emacs Lisp中,我该怎么检查一个变量是否被定义?

4个回答

155

您可能需要使用boundp函数:如果变量(一个符号)不是void,则返回t;更准确地说,如果它的当前绑定不是void,则返回t。否则返回nil。

  (boundp 'abracadabra)          ; Starts out void.
  => nil

  (let ((abracadabra 5))         ; Locally bind it.
    (boundp 'abracadabra))
  => t

  (boundp 'abracadabra)          ; Still globally void.
  => nil

  (setq abracadabra 5)           ; Make it globally nonvoid.
  => 5

  (boundp 'abracadabra)
  => t

14
有时使用INTERN-SOFT检查符号是否存在也可能很有用。 - Rainer Joswig
我有时候也会使用 symbol-value 函数来打印实际值。symbol-value-doc。例如:使用 eval-expression 命令,然后输入以下内容:(symbol-value 'abracadabra) - Dhawan Gayash
这个 let 块对我返回了 nil。这是否与词法绑定有关? - HappyFace

53
除了 dfa的答案,您还可以使用 fboundp 检查它是否绑定为函数:
(defun baz ()
  )
=> baz
(boundp 'baz)
=> nil
(fboundp 'baz)
=> t

4
如果您想从emacs中检查变量的值(我不知道是否适用,因为您写的是“在Emacs Lisp”?): M-:在迷你缓冲区中启动Eval。输入变量名称并按回车键。迷你缓冲区会显示变量的值。
如果变量未定义,则会出现调试器错误。

等价地,M-: (boundp 'the-variable-name) RET 将会检查变量是否存在而无需触发错误。 - Radon Rosborough
2
我非常确定这个问题是关于elisp脚本,而不是Emacs的交互式用户界面。 - binki

3

请记住,变量的值为nil被视为已经定义。

(progn (setq filename3 nil) (boundp 'filename3)) ;; returns t

(progn (setq filename3 nil) (boundp 'filename5)) ;; returns nil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接