SORU
24 EYLÜL 2010, Cuma


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
24 EYLÜL 2010, Cuma


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:

  1. b - ^ tanımlı değil . hata
  2. b yerel bir değişken akım dinamik kapsamında bazı işlev çağrısı - ^ bağlıdır . bu değer
  3. b 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • apenney888

    apenney888

    27 EKİM 2010
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008
  • Tube Time

    Tube Time

    14 Mayıs 2013