Daha önce kullandım let
, ama hiç kullanmadım (yıldız işareti) elisp'te let*
ne anlama let*
geliyor?
fyi bu yıldız işareti nedeniyle google zordu.
Daha önce kullandım let
, ama hiç kullanmadım (yıldız işareti) elisp'te let*
ne anlama let*
geliyor?
fyi bu yıldız işareti nedeniyle google zordu.
Yanıtlar:
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 b
değerine a
ve a
(özellikle en azından a
bu bağlanmış olduğu let
varsayı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, 5
daha sonra bu let
ifade onun (yerel) bağlama yaptığı a
için 42
ve bağlama b
küresel değerine a
, yani 5
.]
Ama (let* ((a 42) (b a))...b)
döner 42
çünkü a
bağ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 i
Elisp
i 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 ...)
F1 f
.
let*
özyinelemeli bir let
anlam gibidir:
(let* ((var1 VAL1)
(var2 VAL2))
...)
gibi
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Böylece büyük harflerin kullanımı VAL1
ve VAL2
bunların ifade olabileceğini gösterir.
Özyinelemeli- let
bağlamanın VAL2
aslında bağımlıysa sonuçları vardır var1
. Etki, Drew'un cevabında zaten açıklanmıştır .
b
genel olarak bağlı olduğu için 5'e eşit olduğunda yazım hatası vardıra
. Bununlet
yerine okumalılet*