SORU
25 NİSAN 2010, Pazar


Paul Graham bazıları'Peltek s noktaları açıklayınız

Yardıma Paul Graham bazı noktaları anlamak What Made Lisp Different ihtiyacım var.

  1. Değişkenlerin yeni bir kavram. Lisp, tüm değişkenleri etkili öğelerdir. Değerleri türleri, değişkenler değil ne, atama veya bağlama fonksiyonu ne anlamı kopyalama göstericiler, anlamına gelir.

  2. Simge türü. Semboller bir işaretçi karşılaştırarak eşitlik test edebilirsiniz dizeleri farklı.

  3. Kod için bir gösterim sembolleri ağaçları kullanıyor.

  4. Bütün dil her zaman kullanılabilir. Okuma zamanı, derleme zamanı ve çalışma zamanı arasında gerçek bir ayrım yoktur. Okurken ya da kod çalıştırmak, ya da derlerken kod okuma çalıştırın, ya da çalışma zamanında kod derleme okuyun.

Bu puan da ne demek? Nasıl C gibi dillerde farklı ya da Java? Başka bir dil Lisp aile diller dışında bu yapıları da var mı?

CEVAP
26 NİSAN 2010, PAZARTESİ


Matt'in açıklaması gayet iyi -- ve attığı bir atış bir karşılaştırma için C ve Java, bunu yapmam ... ama nedense ben gerçekten zevk tartışırken bu konu arada bir, yani ... işte benim ateş bir cevap.

Puan (3) (4):

Ve (4) listenizdeki noktaları (3) şimdi en ilginç ve hala ilgili gibi görünüyor.

Onları anlamak için, Lisp kodu ile ne net bir resim var yürütülmekte olan karakter programcı tarafından yazılmış bir dere şeklinde ... ... yararlıdır. Hadi somut bir örnek:

;; a library import for completeness,
;; we won't concern ourselves with it
(require '[clojure.contrib.string :as str])

;; this is the interesting bit:
(println (str/replace-re #"\d " "FOO" "a123b4c56"))

Clojure bu kod parçacığını aFOObFOOcFOO yazdırır. Not Clojure belki değildir tam olarak tatmin dördüncü nokta listende beri okuma-sırası değil gerçekten açmak için kullanıcı kodu; ben tartışmak ne ifade bu olacak, aksi halde, rağmen.

Yani, bir yerde bir dosyası bu kod var sanırım ve Clojure çalıştırmak istiyoruz. Ayrıca, hadi kitaplığı alma geçtik (basitlik için) varsayalım. İlginç bit (println ile başlar ve ) en sağa kadar biter. Bu tahmin edileceği gibi lexed / ayrıştırılır, ama zaten önemli bir nokta ortaya çıkıyor:sonuç derleyici özel gösterimi -- AST sadece Lisp veri yapısı / düzenli bir Clojure değil bazı özelyani iç içe geçmiş bir liste semboller bir demet içeren, bu durumda tek bir derlenmiş düzenli ifade deseni -- dizeleri ve -- #"\d " değişmez (bu konuda daha fazla aşağıda) karşılık gelen nesne. Bazı Lisps bu işlem için kendi küçük katlanmış ekleyin, ama Paul Graham çoğunlukla Common Lisp atıfta bulundu. Puan sorunuzla ilgili, Clojure CL benzer.

Derleme zamanında bütün dil:

Bu noktadan sonra, tüm derleyici ile ilgilidir (bu da Lisp yorumlayıcısı için doğru olabilir; Clojure kodu her zaman derlenecek olur) işlemek için kullanılan Lisp veri yapıları. Bu noktada harika bir ihtimal belirgin hale gelmesi: neden izin Lisp programcıları için yazmak Lisp fonksiyonları işlemek Lisp verileri temsil eden Lisp programları ve çıkış dönüştürülmüş verileri temsil eden dönüştürdü programları, kullanılacak yerin aslı? Diğer bir deyişle, neden Lisp programcıları sıralar, Lisp makroları adlı derleyici Eklentileri olarak işlevlerini kaydetmek için izin? Ve gerçekten iyi herhangi bir Lisp sistemi bu kapasite var.

Yani, makrolar normal Lisp işlevler derleme zamanında programın sunumunu çalışan, gerçek nesne kodu verildiğinde son derleme aşamasından önce. Beri orada hiçbir sınır üzerindeki her türlü kodu makroları çalıştırmak için izin verilir (özel kodu çalıştırmak genellikle kendisi yazan liberal kullanımı makro odası), tek söyleyebileceğim bu "bütün dil kullanılabilir derleme zamanında".

Okuyun anda bütün dil:

#"\d " düzenli değişmez dönelim. Yukarıda da belirtildiği gibi, bu derleyici yeni kodu ilk söz derleme için hazırlanmakta duyar önce okumak zaman gerçek derlenmiş desen bir nesneye dönüştürülmüş olur. Peki bu nasıl oluyor?

Peki, Clojure şu anda uygulanan, resmi bir şey a clever hack ile mümkün olsa da Paul Graham aklında ne vardı biraz daha farklıdır. Common Lisp, hikaye biraz daha temiz kavramsal olurdu. Temeli ancak benzer: Lisp Okuyucu bir durum makinesi olan, ek olarak gerçekleştirme hal geçişleri ve sonunda ilan edip sahiptir ulaşmış bir "kabul eden Devlet", çiğner ve tükürür Lisp veri yapıları karakterleri temsil eder. Böylece 7* *karakter sayısı 123 vb olur. Önemli nokta şimdi geliyorbu durum makinesi kullanıcı kodu tarafından değiştirilebilir. (Daha önce de belirtildiği gibi, bu CL bu durumda tamamen doğru; Clojure için hack (önerilmez ve kullanılmaz uygulamada) gereklidir. Ama ben sapmak,...) şeklinde olması gerekiyor PG makale

Yani, eğer sen bir Common Lisp programcısı ve ne gibi fikri Clojure tarzı vektör rakamları, sadece tak içine okuyucu bir işlevi tepki gerektiği için bazı karakter dizisi -- [ #[ muhtemelen ve tedavi olarak başlayan bir vektör değişmez sona eşleşen ]. Böyle bir fonksiyon denirokuyucu makrove sıradan bir makro gibi, Lisp kodu, funky gösterim önceden kayıtlı okuyucu makrolar etkin ile yazılmıştır kendisi hangi kodu da dahil olmak üzere herhangi bir tür yürütmek. Senin için zaman okumak her dil var.

Paketlemeye:

Aslında, ne olarak gösterilmiştir şimdiye kadar bir koş düzenli Lisp fonksiyonları okuma zamanı veya derleme zamanı; bir adım, bir ihtiyaçları için buraya anlayış nasıl okuma ve derleme kendilerini Olası okuma, derleme veya çalışma zamanı olduğu için bu fark okuma ve derleme kendileri tarafından gerçekleştirilen Lisp fonksiyonları. Sadece herhangi bir zamanda read eval karakter derelerin Lisp veri okumak veya & Lisp kodunu derlemek çalıştırmak için, sırasıyla arayabilirsiniz. Bütün dil orada, her zaman.

Not nasıl olması Lisp tatmin noktası (3) listenizde esastır B) yönetir tatmin noktası (4) -- özel lezzet makrolar tarafından sağlanan Lisp ağır dayanıyor kodu olmayı temsil tarafından düzenli Lisp veri, bir etkin (3). Bu arada, sadece" kod boy -- makul Lisp kullanarak yazılmış bir XML olabilir. burada gerçekten çok önemlidir "ağaç-ish

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • Subscribe!!

    Subscribe!!

    3 EKİM 2009