SORU
16 ŞUBAT 2009, PAZARTESİ


İZİN karşı İZİN* Common Lisp içinde

İZİN arasındaki farkı anlıyorum ve* () paralel karşı sıralı bağlama İZİN ve teorik bir mesele olarak çok mantıklı geldi. Ama hiç İZİN gerekli olduğun herhangi bir durum var mı? Baktım bu Lisp benim kod tüm son zamanlarda herhangi bir değişiklik İZİN* her İZİN değiştirebilirsin.

Edit: anlıyorum, TAMAMnedenbir adam* tahminen bir makro olarak, ne zaman geri İZİN icat etti. Benim sorum, İZİN* var olduğundan dolayı, İZİN etrafında kalmak için bir sebep mi? İZİN* bir düz kadar iyi bir fikir değil, gerçek Lisp kodu yazdın mı?

Verimlilik değişkeni inanmıyorum. İlk olarak,* bir şeyler VER olduğunca verimli derlenmiş durumlar tanımak o kadar da zor görünmüyor. İkinci olarak, sadece verimlilik etrafında tasarlanmış gibi görünmüyor CL spec içinde bir sürü şey var. (Ne tür bildirimleri ile DÖNGÜ en son ne zaman gördün? O, hiç kullanmadım görmedim anlamak çok zor.) Geç 1980, CL Dick Gabriel kriterler önceoldudüpedüz yavaş.

Bu geriye uyumluluk bir dava gibi görünüyor: akıllıca, kimse bir şey YAPALIM gibi temel kaybetmeyi göze almak istedi. İçimden bir ses oldu, ama rahatlatıcı kimseyi içeri bir sürü gülünç İZİN* daha kolay hale nerede eksik olduğumu aptalca basit bir dava olduğunu duymak güzel.

CEVAP
25 ŞUBAT 2009, ÇARŞAMBA


LAMBDA yerine daha fonksiyonel bir dilde bir gerçek ilkel kendisi değil, İZİN verin. Bu gibi:

(let ((a1 b1) (a2 b2) ... (an bn))
  (some-code a1 a2 ... an))

benzer bir şekilde

((lambda (a1 a2 ... an)
   (some-code a1 a2 ... an))
 b1 b2 ... bn)

Ama

(let* ((a1 b1) (a2 b2) ... (an bn))
  (some-code a1 a2 ... an))

benzer bir şekilde

((lambda (a1)
    ((lambda (a2)
       ...
       ((lambda (an)
          (some-code a1 a2 ... an))
        bn))
      b2))
   b1)

Daha basit bir şey olduğunu hayal edebiliyorum. İZİN ve İZİN verin.

İZİN kodu anlamak daha kolay hale getirir. Tek bağlantıları bir grup görür ve tek tek yukarıdan aşağıya/sağdan sola anlamak gerek olmadan her bağlama akış okuyabilirim 'etkileri (rebindings)'. İZİN* kullanarak bağlamaları bağımsız olmayan programcı (kod okuyan bir) sinyalleri, ama her şey karmaşık hale getiren yukarıdan aşağıya akışı-bir çeşit var.

Common Lisp işi bağlamaları için değerleri hesaplanan kural soldan sağa doğru. Bir işlev çağrısı - soldan sağa değerlendirilir için ne kadar değerleri. Yani, kavramsal olarak basit deyimi ve varsayılan olarak kullanılmalıdır.

DÖNGÜ çeşitleri? Oldukça sık kullanılır. Hatırlanması kolay olan tür bildirimi bazı ilkel formları vardır. Örnek:

(LOOP FOR i FIXNUM BELOW (TRUNCATE n 2) do (something i))

Yukarıda bir fixnum olmak i değişkeni bildirir.

Gabriel 1985 kriterler üzerinde kitabı yayınlanan ve o zamanlar bu kriterler de olmayan CL Lisps ile kullanılmıştır. 1985 - dil tarif CLtL1 kitapta yepyeni kendisi Common Lisp sadece 1984 yılında yayımlandı. Hiç merak uygulamalarının pek o zaman optimize edildi. İyileştirmeleri uygulanan temelde uygulamaları önce (MacLisp gibi) aynı (veya daha az).

Ama İZİN vs İZİN* temel fark, bir kod kullanarak İZİN vermek daha kolay anlamak için insanlar, itibaren bağlayıcı hükümler bağımsız birbirini - özellikle de kötü tarzı yararlanmak için soldan sağa değerlendirme (ayar değişkenleri, bir yan etki olarak).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • The Verge

    The Verge

    8 AĞUSTOS 2006