SORU
12 AĞUSTOS 2011, Cuma


Tembel Değerlendirme vs Makrolar

Düzgün tembel değerlendirme kullandım şimdi Haskell değerlendirme tembel ve-istekli-varsayılan dil ile rahatsız kendim almak alıştım. Bu kullandığım diğer diller ağırlıklı tembel şeyleri değerlendirmek çok garip, normalde çalışırken özel kullanımına ve benzeri ilgili olarak aslında oldukça zararlı. Bu yüzden sadece bazı bilgileri edinerek, aslında kendim yaptımdaha azüretken orijinal dilde. İç çekiş.

Ama AST makrolar aynı şeyi yapmanın başka bir yolu tertemiz teklif ettiklerini duydum. Sıklıkla 'Tembel değerlendirme yapar makrolar gereksiz' ve tersi, çoğunlukla idman Lisp ve Haskell topluluklardan. gibi ifadeler duydum

Çeşitli türevlerini Lisp makroları ile yaptık ettik. Onlar sadece kopyala ve çevresinde kod parçacıkları derleme zamanında ele alınması için yapıştırma çok organize bir yol gibi görünüyordu. Kesinlikle Lispers bu yüzden Kutsal Kase değildi. Ama bu neredeyse kesinlikle onları düzgün kullanamıyorum çünkü. Elbette, sahip makro çalışma sistemi aynı temel veri yapısı, o dilin kendisidir montajı ile gerçekten yararlı, ama yine de temel olarak organize bir şekilde kopyalama ve yapıştırma kodu. Tam zamanı değiştirilmesine izin veren bir dil ile aynı AST makro bir sistem dayandırarak güçlü olduğunu kabul ediyorum.

Bilmek istediğim, nasıl makroları kısa ve öz bir biçimde kullanılabilir ne tembel değerlendirme yapar? Eğer her şeyi yapacaksın olmadan hattı ile bir dosya satır işlemek istersem, sadece üzerinde çizgi-okuma rutin bir çizdiler ki bir listesini döndürür. Mükemmel bir örnek DWİM (ben ne demek). Düşünmenize bile gerek yok.

Ben açıkça makrolar alamadım. Onları kullanılan ve özellikle yutturmaca verilen etkilendim değilim. Çevrimiçi belgeleri okuma üzerine çıkmayacağımı kaçırdığım birşeyler var. Biri bana bu açıklayabilir misiniz?

CEVAP
12 AĞUSTOS 2011, Cuma


Tembel değerlendirme makrolar gereksiz kılıyor

Bu tamamen saçmalık. (Senin suçun değil; bunu daha önce de duymuştum.) Doğru kullanabileceğiniz makroları değiştirmek amacıyla, bağlam, vb ifade değerlendirme, ama bu en temel kullanım makroları ve gerçekten kullanışlı yapmak için tembel bir dil kullanarak ad hoc makrolar yerine fonksiyonlar. Eğer öyleyse bu yönden makrolar de gelirsen, gerçekten hayal kırıklığına uğrarsın.

Makrolar yeni sözdizimsel formlarıyla dil uzatmak için. Makrolar özel yetenekleri vardır

  1. ifade değerlendirme amacıyla, bağlam, vb etkileyen
  2. yeni bağlama şekilleri (ıe . etkileyen oluşturma ^em>kapsamdeğerlendirilen bir ifade)
  3. sahne-derleme zamanı hesaplama, kod analizi ve dönüşüm de dahil olmak üzere

Bunu makrolar (1) oldukça basit olabilir. , Racket, istisna-kullanma FORMU, with-handlers, örneğin call-with-exception-handler, biraz bilgi almak, ve bazı devamı koduna genişleten bir makro. Bu gibi kullanılır:

(with-handlers ([(lambda (e) (exn:fail:network? e))
                 (lambda (e)
                   (printf "network seems to be broken\n")
                   (cleanup))])
  (do-some-network-stuff))

Makro özel dinamik içerik" noktasında tüm özel durumları işleme call-with-exception-handler ilkel dayanarak kaldırdı ediyorlar. "yüklem-ve-handler maddeleri kavramını uygular

Makroları daha sofistike bir kullanım LALR(1) parser generator bir uygulamasıdır. Önceden işlenmesi gereken ayrı bir dosya yerine, parser şeklinde ifade şekli o başka bir tür. Dilbilgisi bir açıklama alır, derleme zamanında tablolar hesaplar ve ayrıştırıcı bir işlev üretir. Eylem rutinleri lexically-kapsamı, dosyadaki diğer tanımlar hatta bağlı lambdadeğişkenler bakın. Hatta eylem başka bir dil uzantıları rutinleri kullanabilirsiniz.

, Typed Racket aşırı uçta Raket yazılı bir lehçesi makroları aracılığıyla uygulanmaktadır. Karmaşık tip bir sistemi Gürültü/Düzeni kod cümleler eşleştirmek için tasarlanmış ve dinamik yazılım sözleşmeleri de makrolar ile uygulanan) ile yazılmış fonksiyonları koruyarak yazılmamış modülleri ile birlikte çalışır. Bir "modülü, tip-Çek genişler ve tanımlarına tür bilgi eklemek için modülü gibi vücut yardımcı makrolar dönüştüren" makro, vb. yazılı yürütür.

FWIW, ayrıca Lazy Racket, Raket tembel bir lehçesi var. lambda, define ve işlevi uygulama makroları için sözdizimi ve güç vaat yeniden birleştirme bir makro, ama her fonksiyon çevirerek uygulanan bir şey değil.

Özetle, yavaş Değerlendirme ve makrolar kesiştiği küçük bir nokta, ama çok farklı şeylerdir. Ve makrolar kesinlikle tembel değerlendirme tarafından sahiplenildiğini değildir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Abe Olandres

    Abe Olandres

    16 EYLÜL 2006
  • boogie2988

    boogie2988

    6 NİSAN 2006
  • Doug Bernards

    Doug Bernard

    7 Kasım 2007