SORU
25 EYLÜL 2008, PERŞEMBE


'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
26 EYLÜL 2008, Cuma


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!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • Grace Su

    Grace Su

    6 Ocak 2006
  • Michael Neal

    Michael Neal

    2 Mayıs 2009