"let *" (yıldız işareti) elisp'te ne anlama geliyor?


Yanıtlar:


20

Bu, birden fazla bağlanma olduğunda, değişkenlerin sırayla bağlandığı anlamına gelir, böylece her biri, kendisinden önce bağlı olanlara, yani bağlarda bundan önce gelenlere bağlı değerlere bağlı olabilir let*.

İçin let(hiçbir yıldız işareti), bağlar hiçbiri (değişkenler, prensip olarak, paralel olarak bağlanmış olabilir) diğerlerinin herhangi önce oluşmaya varsayılabilir.

Yani (let ((a 42) (b a))...b)o bağlamaya çalıştığı için bir hata yükseltebilirsiniz bdeğerine ave a(özellikle en azından abu bağlanmış olduğu letvarsayılır olamaz) bir değere bağlı edilmiş.

[Diğer (örneğin, küresel) değişken ise a bir değere bağlı olduğu, örneğin, 5daha sonra bu letifade onun (yerel) bağlama yaptığı aiçin 42ve bağlama bküresel değerine a, yani 5.]

Ama (let* ((a 42) (b a))...b)döner 42çünkü abağlı alır 42 sonra ve b değerine bağlı olur a.

Elisp kılavuzuna bakın, Yerel Değişkenler düğümü .


Bir yorumda @ DoMiNeLa10'un hatırlatıcısından güncelleme:

Kılavuza ek olarak yardım komutlarını da kullanabilirsiniz . Emacs'a sormanın çeşitli yolları arasında, ilk öğrenenler arasında en yararlı olanlarıdır.

Ve çünkü C-h f let*bize özlü bir şekilde:Each VALUEFORM can refer to the symbols already bound by this VARLIST.


Burada sormakta yanlış bir şey olmasa da, Emacs'a bu tür soruları sorarsanız kendinize bir iyilik yaparsınız . Kılavuzların Bilgi tarayıcısını açmak için kullanın , kılavuzu seçin ve indekse bakmak için kullanın (tamamlanarak). Bu sizi doğrudan bunu kapsayan düğüme götürür.C-h iElispi let*let*

(Ve kılavuz tipik olarak burada yapılacaklardan daha iyi şeyleri kapsar, çünkü binlerce katılımcı tarafından çok fazla zaman ve çaba, doğru yapmayı sağladı: doğru ve eksiksiz.)


Ayrıca bu etiketi kullanarak etiket ve soruları da arayabilirsiniz let-binding: [let-binding]Arama alanına yazmanız yeterli . (Bunu şimdi yapacağım, bu sorunun belki de mükerrer olup olmadığını görmek için ...)


Yukarıdaki örnekte, bgenel olarak bağlı olduğu için 5'e eşit olduğunda yazım hatası vardır a. Bunun letyerine okumalılet*
jue

@jue: Doğru; Teşekkür.
Drew

İle fonksiyonlar hakkında soru sormak da mümkündür F1 f.
DoMiNeLa10

@ DoMiNeLa10: Gerçekten; iyi bir nokta. Yorumlar her zaman silinebildiğinden, cevabı güncelleyerek yanıtladım. Teşekkür.
Drew

5

let*özyinelemeli bir letanlam gibidir:

(let* ((var1 VAL1)
       (var2 VAL2))
  ...)

gibi

(let ((var1 VAL1))
  (let ((var2 VAL2))
    ...))

Böylece büyük harflerin kullanımı VAL1ve VAL2bunların ifade olabileceğini gösterir.

Özyinelemeli- letbağlamanın VAL2aslında bağımlıysa sonuçları vardır var1. Etki, Drew'un cevabında zaten açıklanmıştır .

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.