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

Ответы:

139

вам может понадобиться 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
DFA
источник
14
иногда также может быть полезно использовать INTERN-SOFT, чтобы проверить, существует ли символ.
Райнер Джозвиг,
Я также иногда использую symbol-valueфункцию для вывода фактического значения. символ-значение-док . Например: Использование eval-expressionкоманды и последующий ввод: (symbol-value 'abracadabra)
Дхаван Гаяш
45

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

(defun baz ()
  )
=> baz
(boundp 'baz)
=> nil
(fboundp 'baz)
=> t
Джейкоб Габриэльсон
источник
4

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

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

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

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

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

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

(progn (setq filename3 nil) (boundp 'filename5)) ;; returns nil
Cjohansson
источник