Nasıl Emacs Lisp dinamik kapsama ile yaşamak?
Daha önce ve gerçekten dili gibi Clojure öğrendim. Ben de Emacs sevgi ve Emacs Lisp ile bazı basit şeyleri kesmek zorunda. Zihinsel olarak beni Elisp ile daha sağlam bir şey yapıyor olsa engelleyen bir şey var. Dinamik kapsama kavramı. Bana yabancı olacağını düşünürsek korktum ve yarı-global değişkenler gibi kokuyor.
Değişken bildirimleri şeyler yapmak için güvenli olan ve tehlikeli olan o yüzden bilmiyorum. Anladığım kadarıyla, değişkenler setq seti dinamik kapsama (değil mi?) altında kalan Hangi değişkenler dersin? Bir yere gidelim sana açık sözlü kapsayan, ama izin var da dinamik olduğunu okudum başka bir yerde kapsamlı yapmanızı sağlar okudum.
Sanırım benim en büyük endişe benim kod (setq kullanarak veya izin) yanlışlıkla sonları bazı değişkenlerin platform veya üçüncü taraf kod diyorum ya bundan sonra böyle bir ara benim yerel değişkenler berbat yanlışlıkla. Bunu nasıl bertaraf edebilirim?
Sadece izleyin ve zor hata ayıklama tuhaf bir şekilde ısırılan olmadan kapsamında tam olarak ne olacağını biliyorum o başparmak birkaç basit kural var mı?
CEVAP
O kadar da kötü değil.
Temel sorunlar 'serbest değişken fonksiyonları. görünebilir?
(defun foo (a)
(* a b))
İşlevi yukarıda a
yerel bir değişkendir. b
özgür bir değişkendir. Dinamik bağlama gibi Emacs Lisp sistemi, b
çalışma zamanı baktı. Şimdi üç durum vardır:
b
- ^ tanımlı değil . hatab
yerel bir değişken akım dinamik kapsamında bazı işlev çağrısı - ^ bağlıdır . bu değerb
genel değişken ->bu değer
Sorunlar o zaman olabilir:
- bağlı bir değer (küresel veya yerel bir işlev çağrısı, muhtemelen istenmeyen gölgesinde
- tanımlanmamış bir değişken ^ gölgeli DEĞİLDİR . erişim hatası
- global bir değişken ^ gölgeli DEĞİLDİR . alır, istenmeyen olabilir hangi küresel değer
Bir derleyici ile bir Lisp, yukarıdaki işlevi derleme ücretsiz bir değişken olduğunu belirten bir uyarı oluşturabilir. Genellikle Derleyiciler Common Lisp yapar. Bir tercümana uyarı vermeyecektir, sadece çalışma anında etkisini göreceksiniz.
Tavsiye:
- ücretsiz değişkenler yanlışlıkla kullanmayın emin olun
- genel değişkenler, kaynak kodu,
*foo-var*
genellikle nokta için kolay, böylece özel bir adı var, emin olun
Yazmayın
(defun foo (a b)
...
(setq c (* a b)) ; where c is a free variable
...)
Yazma:
(defun foo (a b)
...
(let ((c (* a b)))
...)
...)
Bağlama tüm değişkenleri kullanmak istiyor ve başka bir yere bağlı olmadığından emin olun.
Temel olarak durum bu.
GNU Emacs versiyonu bu yana 24 sözlü bağlayıcı Emacs Lisp onun desteklenir. Bakın: Lexical Binding, GNU Emacs Lisp Reference Manual.
Emacs Lisp, nasıl eğer bir değişken ta...
Nasıl bir dosya ise Emacs Lisp kullana...
Nasıl iki JavaScript nesnelerin özelli...
Nasıl nrepl-ritz-jack-in yapmak işe uz...
Nasıl Emacs yazı tipi boyutunu ayarlam...