Как в Emacs Lisp проверить, определена ли переменная?

Как в Emacs Lisp проверить, определена ли переменная?


person mike    schedule 16.04.2009    source источник


Ответы (4)


вам может понадобиться boundp: возвращает 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
person dfa    schedule 16.04.2009
comment
иногда также может быть полезно использовать INTERN-SOFT, чтобы проверить, существует ли символ. - person Rainer Joswig; 16.04.2009
comment
Я также иногда использую функцию symbol-value для вывода фактического значения. символ-значение-документ. Например: используя команду eval-expression, а затем набирая это: (symbol-value 'abracadabra) - person Dhawan Gayash; 26.09.2020
comment
Блок let возвращает мне nil. Это работает с лексической привязкой? - person HappyFace; 15.05.2021

В дополнение к dfa answer вы также можете проверить, привязан ли он как функция с помощью fboundp:

(defun baz ()
  )
=> baz
(boundp 'baz)
=> nil
(fboundp 'baz)
=> t
person Jacob Gabrielson    schedule 17.04.2009

Если вы хотите проверить значение переменной из emacs (я не знаю, применимо ли это, поскольку вы написали «в Emacs Lisp»?):

M-: запускает Eval в мини-буфере. Введите имя переменной и нажмите return. Мини-буфер показывает значение переменной.

Если переменная не определена, вы получите ошибку отладчика.

person Gauthier    schedule 29.06.2010
comment
Точно так же M-: (boundp 'the-variable-name) RET будет проверять без необходимости запуска ошибки. - person Radon Rosborough; 25.12.2016
comment
Я почти уверен, что речь идет о сценариях elisp, а не об интерактивном пользовательском интерфейсе Emacs. - person binki; 04.07.2017

Помните, что переменные, имеющие значение nil, считаются определяемыми.

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

(progn (setq filename3 nil) (boundp 'filename5)) ;; returns nil
person cjohansson    schedule 07.07.2018