'Lisp içinde alıntı ne zaman kullanılır
Sonra yapım ile büyük parçaları bir tanıtım Lisp kitabı, ben hala ne olduğunu anlayamamıştım özel operatör (quote)
(ya da eşdeğeri '
) işlev, henüz bu olmuştur her yerinde Lisp kodu olduğunu gördüm.
Ne işe yarar?
CEVAP
Kısa cevap Varsayılan değerlendirme kuralları ve Bypass yapındeğilifade (sembol veya s-exp), bu işlev için birlikte geçen tam olarak yazdığınız gibi değerlendirir.
Uzun Cevap: Varsayılan Değerlendirme Kuralı
(O konuya sonra geleceğim) normal bir işlev çağrıldığında, tüm bağımsız değişkenler için geçen değerlendirilir. Bu yazma anlamına gelir:
(* ( a 2)
3)
Sırayla a
2 değerlendirme ( a 2)
, değerlendirir. Sembolün değeri a
geçerli değişken bağlama seti baktı ve sonra değiştirilir. Söyle a
şu anda değeri 3 bağlı:
(let ((a 3))
(* ( a 2)
3))
* *19, 3 çağrılır ve 2 5 verimli oluruz. Bizim orijinal formu şimdi (* 5 3)
15 olarak biliniyor.
quote
Zaten Açıkla!
Tamam. Yukarıda görüldüğü gibi, bir işlev için tüm argümanları eğer geçmek isterseniz Çok olarak değerlendirilirsembola
ve değeri değil, onu değerlendirmek istemiyorum. Lisp sembolleri, değerleri ve diğer dillerde kullanılan dizeler, hash tabloları anahtarı gibi yer işaretleri olarak iki çift olabilir.
Bu quote
giriyor. Python uygulaması kaynak ayırma arsa, daha ziyade Lisp içinde komplo yapmak istediğini söyle. Python uygulaması böyle bir şey var:
print "'("
while allocating:
if random.random() > 0.5:
print "(allocate %d)" random.randint(0, 20)
else:
print "(free %d)" % random.randint(0, 20)
...
print ")"
Çıkış bu gibi (biraz prettyfied) vererek:
'((allocate 3)
(allocate 7)
(free 14)
(allocate 19)
...)
Söylediklerim quote
hakkında unutmayın ("") kene varsayılan kural geçerli değil? neden İyi. Aksi halde ne olacağını allocate
free
değerlerine baktı ve biz bunu istemiyoruz. Bizim Lisp, yapmak dileğiyle:
(dolist (entry allocation-log)
(case (first entry)
(allocate (plot-allocation (second entry)))
(free (plot-free (second entry)))))
Yukarıdaki veriler için, işlev çağrıları, aşağıdaki sıralı yapılmış olması gerek
(plot-allocation 3)
(plot-allocation 7)
(plot-free 14)
(plot-allocation 19)
Ama list
Ne Hakkında?
Bazen seniyapınbağımsız değerlendirmek istiyorum. Şık bir işlevi, bir sayı ve bir dize işlemek ve sonuçta oluşan bir liste dönen ... şeyler var. Hadi yanlış bir başlangıç yapmak:
(defun mess-with (number string)
'(value-of-number (1 number) something-with-string (length string)))
Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER (1 NUMBER) SOMETHING-WITH-STRING (LENGTH STRING))
Hey! Bu bizim istediğimiz şey değil. İstiyoruzseçicibazı argümanlar değerlendirmek ve semboller olarak diğerlerini bırakın. #2 deneyin!
(defun mess-with (number string)
(list 'value-of-number (1 number) 'something-with-string (length string)))
Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER 21 SOMETHING-WITH-STRING 3)
Sadece quote
Ama backquote
Değil
Çok daha iyi! Bu arada, bu model sadece bunu yapmak için özel bir sözdizimi vardır (çoğunlukla) makrolar çok yaygındır. Backquote:
(defun mess-with (number string)
`(value-of-number ,(1 number) something-with-string ,(length string)))
quote
açıkça virgül ile başlatılması yeterli olurdu bazı değişkenleri değerlendirmek için seçeneği ile ama kullanmak gibi. Sonuç list
ama eğer bir makro kodu oluşturma iseniz çoğu zaman sadece kod dönen küçük parçaları değerlendirmek istiyorum, backquote daha uygundur yani kullanmakla eşdeğerdir. Kısa listeler list
daha okunaklı olabilir.
Selam quote
Unuttun!
Bu bizi nereye bırakıyor? Doğru ya, ne quote
mu gerçekten? Bu sadece argüman(lar) unevaluated verir! Normal işlevleri hakkında başlangıçta ne dediğimi hatırlıyor musun? Bazı operatörlerin işlevleri/ortaya çıktıdeğilonların argümanları değerlendirin. Gibi EĞER başka bir şube alındıysa öyle olmasa değerlendirilecek, sağ istemezsin, değil mi? -Sözdeözel operatörlermakrolar ile birlikte, bu işler böyle. Özel operatörler de bunun üzerine farklı şekillerde onları bir arada birleştirerek Lisp geri kalanı uygulayabilirsiniz kuralları -- dil -- minimal set. aksiyom vardır
** 42 ama geri
Lisp> (quote spiffy-symbol)
SPIFFY-SYMBOL
Lisp> 'spiffy-symbol ; ' is just a shorthand ("reader macro"), as shown above
SPIFFY-SYMBOL
Karşılaştırmak (Steel Bank Common Lisp):
Lisp> spiffy-symbol
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD "initial thread" RUNNING {A69F6A9}>:
The variable SPIFFY-SYMBOL is unbound.
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-INT:SIMPLE-EVAL-IN-LEXENV SPIFFY-SYMBOL #<NULL-LEXENV>)
0]
Geçerli kapsamda spiffy-symbol
çünkü yok!
Özetliyor
quote
, backquote
(ile virgül), ve list
bazı araçları kullanmak için listeler oluşturun, sadece listeleri değerleri, ama gördün mü olarak kullanılabilir hafif (gerek yok tanımlamak bir struct
) veri yapıları!
Eğer daha fazla öğrenmek istiyorsanız, Eğer zaten geniş programlama içine eğer Lisp öğrenme için pratik bir yaklaşım için Peter Seibel kitabı Practical Common Lisp tavsiye ederim. Sonunda Lisp yolculuğa, paketleri de kullanmaya başlayacağız. Garret The Idiot's Guide to Common Lisp Packages Ron bu iyi bir açıklama yapar.
Happy hacking!
ArrayList üzerinde LinkedList ne zaman...
Sanal yıkıcılar ne zaman kullanılır?...
Ne zaman bir komut dosyası etiketi içi...
Neden benim program tam olarak 8192 el...
Evvel zaman içinde, zaman > daha hı...