Emacs Lisp'te bir değişkenin tanımlı olup olmadığını nasıl kontrol ederim?


93

Emacs Lisp'te bir değişkenin tanımlı olup olmadığını nasıl kontrol ederim?

Yanıtlar:


139

boundp isteyebilirsiniz: değişken (bir sembol) void değilse t döndürür; daha doğrusu, mevcut bağının geçersiz olmaması durumunda. Aksi takdirde sıfır döndürür.

  (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
Bazen bir sembolün var olup olmadığını kontrol etmek için INTERN-SOFT kullanmak da yararlı olabilir.
Rainer Joswig

Bazen symbol-valuegerçek değeri yazdırmak için işlevi de kullanıyorum . sembol-değer-doc . Egs: eval-expressionKomutu kullanarak ve sonra şunu yazarak: (symbol-value 'abracadabra)
Dhawan Gayash

45

Ek olarak DFA cevap da bunun kullanarak bir fonksiyonu olarak bağlı olup olmadığını görmek isteyebilir fboundp :

(defun baz ()
  )
=> baz
(boundp 'baz)
=> nil
(fboundp 'baz)
=> t

4

Emacs içinden bir değişken değeri kontrol etmek istiyorsanız ("Emacs Lisp'te" yazdığınız için bunun geçerli olup olmadığını bilmiyorum?):

M-:Evalmini arabellekte başlar . Değişkenin adını yazın ve return tuşuna basın. Mini arabellek, değişkenin değerini gösterir.

Değişken tanımlanmamışsa, bir hata ayıklayıcı hatası alırsınız.


Eşdeğer, M-: (boundp 'the-variable-name) RETbir hata tetiklenmesi için gerek kalmadan kontrol edecektir.
Radon Rosborough

Eminim soru, Emacs'ın etkileşimli kullanıcı arayüzü değil, elisp betikleri ile ilgilidir.
binki

0

Nil değerine sahip değişkenlerin tanımlanmış olarak kabul edildiğini unutmayın.

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

(progn (setq filename3 nil) (boundp 'filename5)) ;; returns nil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.