Raket özellikleri - Racket features

Racket, bir araç olarak aktif geliştirme aşamasındadır. programlama dili araştırması 1990'ların ortalarından beri ve yıllar içinde birçok özellik biriktirmiştir. Bu makale, bu özelliklerden bazılarını açıklar ve gösterir. Racket'in ana tasarım hedeflerinden birinin, her ikisi de yeni diller oluşturmaya uyum sağlamak olduğunu unutmayın. alana özgü diller ve tamamen yeni diller.[1]Bu nedenle, aşağıdaki örneklerin bazıları farklı dillerdedir, ancak hepsi Racket'te uygulanmıştır. Bakınız ana makale daha fazla bilgi için.

Çekirdek Racket uygulaması oldukça esnektir. Lehçeler kullanmadan bile, tam özellikli bir betik dili olarak işlev görebilir, hem Windows yerel GUI ile hem de olmadan çalışabilir ve web sunucusu oluşturmadan grafiklere kadar görevler yapabilir.

Çalışma zamanı desteği

Çöp toplama, kuyruk aramaları ve alan güvenliği

Raket üç farklı çöp toplayıcıları:

  • Başlangıçta muhafazakar Boehm çöp toplayıcı kullanıldı. Ancak, konservatif toplama, bir web sunucusu gibi uzun süre çalışan işlemler için pratik değildir - bu tür işlemler, belleği yavaşça sızdırmaya meyillidir. Ek olarak, muhafazakar bir toplayıcının, belirli programların çalışmasını imkansız hale getirecek kadar hızlı bir şekilde bellek sızdırdığı patolojik durumlar da vardır. Örneğin, sonsuz bir listeyi dolaşırken, bir işaretçiyi tutmanın tek bir muhafazakar hatası, tüm listenin bellekte tutulmasına ve kullanılabilir belleğin hızla taşmasına yol açar. Bu toplayıcı, Racket topluluğunda genellikle "CGC" olarak anılır.
  • SenoraGC, esas olarak hata ayıklama ve bellek izleme için tasarlanmış alternatif bir koruyucu çöp toplayıcıdır.
  • Hareketli bellek yöneticisi ("3m" olarak da bilinir) hassas bir çöp toplayıcıdır ve 2007'den beri Racket'in varsayılan toplayıcısıdır. Bu toplayıcı nesildir ve saklama görevlileri aracılığıyla bellek muhasebesini destekler (aşağıya bakın). Toplayıcı, kendisi Racket'te yazılan bir C kaynak transformatörü olarak uygulanır. Bu nedenle, derleme işlemi muhafazakar toplayıcıyı kullanır. önyükleme.

Tüm uygulamalar gibi Şema aile, Racket tam kuyruk araması eleme. Racket bunu daha da ileri götürür: dil, aracılığıyla alan için tamamen güvenli hale getirilir. canlı değişken analizi. Bu, hassas çöp toplayıcıyı tamamlar ve bazı durumlarda, Lazy Racket uygulamasında olduğu gibi, iki özellik düzgün bir şekilde yürütülmesi için çok önemlidir. Bu, ek derleyici optimizasyonlarına ek olarak lambda kaldırma ve tam zamanında derleme.

Sistem arayüzü ve komut dosyası

Racket'in sistem arayüzü asenkron içerir engellemeyen G / Ç, yeşil ipler senkronizasyon kanalları, semaforlar, alt süreçler, ve TCP prizler.

Aşağıdaki program 12345 portunda bir "yankı sunucusu" başlatır.

#lang raket(tanımlamak dinleyici (tcp-listen 12345))(İzin Vermek yankı sunucusu ()  ;; bir TCP sunucusu oluştur  (değerleri tanımla (içinde dışarı) (tcp-accept dinleyici))  ;; gelen bir bağlantıyı (yeşil) iş parçacığı içinde ele almak  (Konu (λ () (kopyalama bağlantı noktası içinde dışarı) (yakın çıkış bağlantı noktası dışarı)))  ;; ve ek istemcileri kabul etmek için hemen geri dönün  (yankı sunucusu))

Dinamik derleme ve zengin bir sistem arayüzünün birleşimi, Racket'i şu özelliklere benzer, yetenekli bir betik dili yapar. Perl veya Python.

Aşağıdaki örnek, geçerli dizinden başlayarak bir dizin ağacında yürümeyi gösterir. Kullanır dizin içi ağaçta yürüyen bir dizi oluşturmak için işlev. için form bağları yol sıradaki her yola ve regexp-match? bu yolları verilenlere karşı test eder regexp Desen.

#lang raket;; Tüm alt dizinlerde Racket kaynaklarını bulur(için ([yol (dizin içi)]) ; mevcut ağacın üzerinde yineleyin  (ne zaman (regexp-match? #rx "[.] rkt $" yol)    (printf "kaynak dosya: ~ a n" yol)))

Sonraki örnek, önceden görülen satırları kaydetmek ve yalnızca benzersiz olanları yazdırmak için bir karma tablo kullanır.

#lang raket;; Stdin'den her benzersiz satırı rapor edin(İzin Vermek ([testere (hash)])  (için ([hat (hatta)])    (sürece (hash-ref testere hat #f)      (displayln hat))    (hash-set! testere hat #t)))

Bu programların her ikisi de çalıştırılabilir DrRacket veya komut satırında raket çalıştırılabilir. Raket bir baş harfi görmezden gelir shebang satırı, bu tür programları çalıştırılabilir komut dosyalarına dönüştürmeyi mümkün kılar. Aşağıdaki komut dosyası, Racket'in kütüphanesini kullanmanın yanı sıra bunu göstermektedir. komut satırı bağımsız değişkenini çözümleme:

#! / usr / bin / env raket#lang raket(Komut satırı #: args (temel dir ext yeniden) (için ([p (dizin içi)]       #:ne zaman (regexp-match? (string-append "[.]" ext "$") p)       [(hat num) (endeksli (dosya-> satırlar p))])   (ne zaman (regexp-match? (Pregexp yeniden) hat)     (printf "~ a: ~ a: ~ a ~ n" p (+ num 1) hat))))

Komut dosyası grep benzeri bir yardımcı programdır ve üç komut satırı argümanı beklemektedir: bir temel dizin, bir dosya adı uzantısı ve bir (perl uyumlu) düzenli ifade. Verilen son eke sahip dosyalar için temel dizini tarar ve regexp kalıbıyla eşleşen satırları yazdırır.

Kaynak yönetimi ve korumalı alan oluşturma

Racket, bir "bekçi" kavramına sahiptir: bir kaynak yöneticisi olarak hareket eden bir tür değer. Bu genellikle, her bağlantının yeni bir saklayıcıda ele alındığı ağ sunucularında kullanılır ve işleyici tarafından açık bırakılmış olabilecek tüm kaynakların (örneğin, açık bağlantı noktaları) "temizlenmesini" kolaylaştırır. Aşağıda, "echo server" örneğini böyle bir saklayıcı kullanımıyla genişletir:

#lang raket(tanımlamak dinleyici (tcp-listen 12345));; bağlantı başına işleyici(tanımlamak (işleyici içinde dışarı)  (kopyalama bağlantı noktası içinde dışarı)  (yakın çıkış bağlantı noktası dışarı))(İzin Vermek yankı sunucusu ()  (değerleri tanımla (içinde dışarı) (tcp-accept dinleyici))  (Konu (λ () (İzin Vermek ([c (bakıcı)])                  (parametreleştirmek ([mevcut emanetçi c])                    (işleyici içinde dışarı)                    (saklama-kapatma-tümü c)))))  (yankı sunucusu))

Muhafızlar, 3m çöp toplayıcının bellek muhasebesi özelliği ve çalışma zamanının ek özelliklerini kontrol eden bir dizi ek çalışma süresi parametresiyle birleştiğinde, tamamen güvenli sanal alanda çalıştırma bağlamları oluşturmayı mümkün kılar. raket / sandbox kütüphane bu tür işlevselliği basit bir şekilde sağlar. Aşağıdaki örnek, belirtilen bağlantı noktasında bir "REPL sunucusu" oluşturur; Bu bağlantı noktasına bağlanmak, değerlendirmenin sandbox'ın çeşitli koruma yönlerine tabi olması dışında, düz bir Racket REPL gibi görünecektir. Örneğin, bu REPL'den dosya sistemine erişmek, ağ bağlantısı oluşturmak, alt işlemleri çalıştırmak veya çok fazla zaman veya bellek kullanmak mümkün değildir. (Aslında, bu REPL halka açıklanacak kadar güvenlidir.)

#lang raket(gerek raket / sandbox)(tanımlamak e (değerlendirici 'raket / taban))(let-değerler ([(ben Ö) (tcp-accept (tcp-listen 9999))])  (parametreleştirmek ([akım-giriş-bağlantı noktası  ben]                 [akım çıkışı bağlantı noktası Ö]                 [geçerli hata bağlantı noktası  Ö]                 [geçerli değerlendirme e]                 [geçerli okuma etkileşimi (λ (x içinde) (okumak içinde))])    (okuma-değerlendirme-baskı-döngüsü)    (fprintf Ö " nHoşçakal... n")    (yakın çıkış bağlantı noktası Ö)))

Web ve ağ programlama

Sonraki örnek bir Web sunucusu kullanmak web sunucusu / insta dil. Sunucuya her bağlantı yapıldığında, Başlat işlevi almak için çağrılır HTML müşteriye geri göndermek için.

#lang web sunucusu / insta;; Küçük bir "merhaba dünya" web sunucusu(tanımlamak (Başlat istek)  (yanıt / xexpr '(html (vücut "Selam Dünya"))))

Racket ayrıca kazıyıcı ve robot yazmak için ihtiyaç duyacağınız işlevleri de içerir. Örnek olarak, aşağıdaki işlev bir arama dizesi için Google sonuçlarını listeler.

#lang raket;; Basit web kazıyıcı(gerek net / url net / uri-codec)(tanımlamak (bırak-ben-google-that-for-you str)  (İzin Vermek* ([g "http://www.google.com/search?q="]         [sen (string-append g (uri kodlamak str))]         [rx #rx "(? <= 

). *? (? =

)"
]) (regexp-match * rx (get-pure-port (string-> url sen)))))

Kitaplık ayrıca http dışındaki protokoller için destek içerir:

#lang raket;; Raketten zamanlanmış bir e-posta uyarısı gönderme(gerek net / sendmail)(uyku (* (- (* 60 4) 15) 60)) ; 3s 45d bekle(mesaj-gönder (getenv "E-POSTA") "Park sayacı uyarısı!" (liste (getenv "E-POSTA")) boş boş '("Dışarı çıkma ve arabanı hareket ettirme zamanı."))

Grafikler

Grafik yetenekleri, farklı izleyiciler için tasarlanmış birkaç farklı türde gelir. 2htdp / resim kütüphane, görüntü oluşturmak için uygun işlevler sağlar. Bu kütüphane esas olarak şu ülkelerdeki öğrenciler tarafından kullanılmaktadır: HtDP tabanlı kurslar. Aşağıdaki örnekte, bir Sierpinski işlev tanımlanır ve (aynı zamanda) bir Sierpinski üçgeni derinlik 8.

#lang raket;; Bir resim(gerek 2htdp / resim)(İzin Vermek Sierpinski ([n 8])  (Eğer (sıfır? n)    (üçgen 2 'katı 'kırmızı)    (İzin Vermek ([t (Sierpinski (- n 1))])      (donmak (yukarıda t (yanında t t))))))

DrRacket düzenleyicileri görüntüler içerebilir ve DrRacket, diğer tüm değer türleri gibi (tam sayılar veya listeler gibi) görüntü değerlerini görüntüler. Örneğin yukarıdaki programı çalıştırmak, aslında kesilip başka bir programa yapıştırılabilen bir Sierpinski üçgeni görüntüler.

arsa kütüphane daha olgun izleyiciler ve ihtiyaçlar için imaj değerleri oluşturur. Örneğin, aşağıdaki program ikisinin toplamını çizer (üç boyutlu) Gausslular, eşmerkezli, kısmen saydam yüzeyler olarak:

#lang raket;; İki 3D Gaussian'ın toplamını eşmerkezli eş yüzeyler olarak görselleştirin;; Not: Bu örnek, Racket 5.2 veya sonrasını gerektirir(gerek arsa);; (Cx, cy, cz) merkezli bir R x R x R -> R Gauss işlevi döndürür(tanımlamak ((gauss cx cy cz) x y z)  (tecrübe (- (+ (sqr (- x cx)) (sqr (- y cy)) (sqr (- z cz))))));; Üç bağımsız değişkenli işlevlerde çalışmak için + kaldırır(tanımlamak ((f3 + g h) x y z) (+ (g x y z) (h x y z)));; İki Gaussian'ın toplamını temsil eden bir görüntü değeri oluşturur(plot3d (izosurfaces3d (f3 + (gauss 0 0 0) (gauss 1.5 -1.5 0))                       -1 2.5 -2.5 1 -1 1                       #:etiket "g"))  ; etiketleme bir açıklama ekler

Burada izosurfaces3d işlev, curried işlevinin ilk bağımsız değişkeni için üç bağımsız değişkenli bir işlevi gerektirir. f3 + gereçler. Görüntü değerlerini oluşturmanın yanı sıra, arsa dosyaları da yazabilir PNG, PDF, PostScript ve SVG biçimler.

GUI programlama

Racket taşınabilir GUI yukarıda bahsedilen kitaplıkların üzerine inşa edildiği katman. Yerel aracılığıyla uygulanır pencereler API aracılığıyla Kakao açık Mac OS X ve aracılığıyla GTK + Linux ve diğerleri üzerinde. Racket API, bir şekilde ilgili sınıf tabanlı bir araç setidir. wxWidgets başlangıçta kullanılan.

Aşağıdaki basit tahmin oyunu, GUI araç takımı ile kodlamayı gösterir. çerçeve% sınıf üst düzey bir pencere uygular ve buton% bir düğme uygular. Kontrol burada tanımlanan işlev, düğmenin geri arama eylemi için kullanılan bir işlev üretir.

#lang raket / gui;; Bir GUI tahmin oyunu(tanımlamak gizli (rastgele 5))(tanımlamak f (yeni çerçeve% [etiket "Tahmin oyunu"])) ; üst düzey pencere(tanımlamak t (yeni İleti% [ebeveyn f]               [etiket "Düşündüğüm sayıyı tahmin edebilir misin?"]))(tanımlamak p (yeni yatay bölme% [ebeveyn f]))    ; yatay konteyner(tanımlamak ((kontrol etmek ben) btn Evt)  (mesaj Kutusu "." (koşul [(< ben gizli) "Çok küçük"]                         [(> ben gizli) "Çok büyük"]                         [Başka         "Kesinlikle!"]))  (ne zaman (= ben gizli) (göndermek f göstermek #f)))         ; success => pencereyi kapat(için ([ben (aralık içi 10)])                        ; tüm düğmeleri oluştur  (yapmak-nesne buton% (biçim "~ a" ben) p (kontrol etmek ben)))(göndermek f göstermek #t) ; uygulamayı başlatmak için pencereyi göster

GUI, bu şekilde veya PLaneT'de bulunan bir GUI tasarım programı yardımıyla elle kodlanabilir.[2]

Slayt gösterisi

Kaymak tabanlı sunumlar kullanılarak Racket'te de geliştirilebilir. slayt gösterisi dil, çok benzer Işınlayıcı, ancak Racket'in programatik olanaklarıyla. Slaytların öğeleri, birleştirilebilen resimlerdir.

Örneğin, aşağıdaki program tam ekran olarak bir başlık slaydını ve ardından bazı resimlerin bulunduğu bir slaydı görüntüler. vc-append ve hc-append işlevleri, resimleri sırasıyla dikey ve yatay olarak birleştirir ve diğer eksende ortalanır.

#lang slayt gösterisi(kaymak (Metin "Slayt gösterisi" 'Roma 56) (Metin "Raket içinde sunum yapmak"       'Roma 40))(kaymak #:Başlık "Bazı fotoğraflar" (uygulamak vc-append        (için / liste ([ben 5])          (tanımlamak (ölçek + renk p c)             (renklendirmek (ölçek p (/ (ekle1 ben) 5)) c))          (hc-append            (ölçek + renk (dolu dikdörtgen 100 50)  "koyu mavi")           (ölçek + renk (disk 100)                 "koyu yeşil")           (ölçek + renk (ok 100 (/ pi 6))       "koyu Kırmızı")           ))))

Uzantı paketleri PLaneT'de de mevcuttur,[2] örneğin dahil etmek Lateks elementler.

Yabancı işlev bir arayüz

Raket özellikleri yabancı işlev arabirimi dayanmaktadır libffi. Arayüz güvenli olmayan düşük seviyeli yazmaya izin verir C bellek ayırabilen kod benzeri kod, referans işaretçileri, içindeki fonksiyonlara çağrı paylaşılan kitaplıklar ve Racket işlevlerine geri aramalar gönderir (libffi kapanışlarını kullanarak). Çekirdek uygulama libffinin (C ile yazılmış) üzerinde ince bir katmandır ve tam arayüz daha sonra Racket kodu aracılığıyla uygulanır. Arabirim, makroları yoğun bir şekilde kullanır ve anlamlı bir Racket tabanlı arayüz açıklama dili. Bu dil, daha yüksek sıralı işlevler için tek tip temsil (geri aramalar ve belirtme çizgileri farklı olduğunda tuzaklardan kaçınma), düz Racket yapılarına benzer yapı tanımları ve girdi ve çıktıyı temsil edebilen özel işlev türleri gibi bir dizi yararlı özelliğe sahiptir. işaretçiler, örtük bağımsız değişkenler (örneğin, başka bir bağımsız değişken olarak iletilen bir vektördeki öğelerin sayısını sağlayan bir bağımsız değişken). Altta yatan GUI araç kitlerine erişmek için bu arayüzü kullanarak, Racket kendi GUI katmanını tamamen Racket'te uygular.[3]

FFI bir dizi farklı şekilde kullanılabilir: bir kitaplık için eksiksiz bir yapıştırıcı katmanı yazmaktan (Racket'in OpenGL ciltleme), tek bir yabancı işlevi hızlı bir şekilde çıkarmak için. İkinci yaklaşımın bir örneği:

#lang raket / taban;; FFI'nin basit kullanımı(gerek ffi / güvensiz)(tanımlamak mci-send-string  (get-ffi-obj "mciSendStringA" "Winmm"    (_eğlence _string [_Işaretçi = #f] [_int = 0] [_Işaretçi = #f]          -> [ret : _int])))(mci-send-string "play sound.wav bekle")

Dil uzantıları

Racket'in en dikkate değer özelliği, yeni inşa etme yeteneğidir. alana özgü ve genel amaçlı Diller. Bu, bir dizi önemli özelliği birleştirmenin sonucudur:

  • kod bağlama ve ad alanı yönetimi için kullanılan esnek bir modül sistemi,
  • yeni sözdizimsel formlar oluşturabilen kapsamlı bir makro sistemi (derleyici API'si olarak işlev görür),
  • (bir araya getirilebilir, sınırlandırılmış) sürdürmeler, kaynak yönetimi vb. gibi dil uygulayıcılarının kullanabileceği özellikler sağlayan zengin bir çalışma zamanı sistemi,
  • yeni dil sözdizimleri için ayrıştırıcıları belirlemenin (ve uygulamanın) bir yolu.

Modül sistemi, bu özelliklerin birleştirilmesinde önemli bir rol oynar ve her birinin farklı bir dilde yazılabildiği bir dizi modüle yayılan kod yazmayı mümkün kılar.

Bu tür diller, Racket dağıtımında ve kullanıcı kitaplıklarında yaygın olarak kullanılmaktadır. Aslında, yeni bir dil oluşturmak o kadar kolaydır ki, bir avuç dolusu kullanımdan daha azına sahip bazı diller vardır.

Racket bir dizi kullanışlı dil ile birlikte gelir, bazıları Racket'in varsayılan dilinden çok farklıdır.

Karalama

Racket'in dokümantasyon sistemi olan Scribble, düz yazı yazmak için kullanılan bir dizi dil biçiminde gelir. Racket'in dokümantasyonunun yanı sıra kitap ve makale yazmak için kullanılır. Aslında, tek bir "karalama" dilinden ziyade, her biri farklı bir amaca yönelik olan (çok benzer) bir lehçeler ailesidir.

Aşağıdaki örneği çalıştırmak için, DrRacket'e kopyalayın ve görünecek iki karalama oluşturma düğmesinden birini tıklayın (PDF oluşturma pdfTeX ). Alternatif olarak, karalama dosyada yürütülebilir.

#lang karalama / taban@; `` Scribble '@ (required (planet neil / numspell)) @ title {99 Bottles of Beer} kullanarak bir PDF veya HTML belgesi oluşturun. Hayatınızda biraz @emph {blah blah} gerekmesi durumunda. @ (İtemlist /liste ([n (aralık içi 99 0-1)]) (tanım N (sayı-> İngilizce n)) (tanım N-- (sayı-> ingilizce (alt1 n))) @item {@ string-titlecase[N] Duvardaki bir şişe bira, @N şişe bira. Birini al, etrafından dolaştır, @ N-- duvarda bir şişe bira.}))

Karalama dillerinin en çarpıcı özelliği, metin açısından zengin kod için özel olarak tasarlanmış yeni bir sözdizimi kullanmalarıdır.[4] Sözdizimi serbest biçimli metne, dize enterpolasyonuna, özelleştirilebilir alıntılara izin verir ve aşağıdaki gibi diğer uygulamalarda kullanışlıdır ön işleme metni, metin oluşturma ve HTML şablon sistemleri. Sözdiziminin düz S ifadelerini genişlettiğine ve bu tür ifadeler için alternatif bir girdi olarak uygulandığına dikkat edin.

#lang karalama / metinMerhaba, ben bir metin dosyasıyım - beni çalıştır. @ (Define (üç kez. Metin) @list {@text, @text, @text}) @ üç kez {SPAM}! @ Üç kez {HAM}!

Yazılı Raket

Typed Racket bir statik olarak yazılmış Raket çeşidi. tip sistemi uyguladığı benzersizdir, çünkü geliştirmedeki motivasyon olabildiğince çok deyimsel Racket kodu barındırıyordu - sonuç olarak alt türleri, birliği ve daha fazlasını içeriyordu.[5] Typed Racket'in diğer bir amacı, bir programın bölümlerinin yazılı dile taşınmasına izin vermektir, böylece türlenmemiş koddan yazılan kodu çağırmayı ve tam tersini dinamik oluşturarak sözleşmeler tür değişmezlerini zorlamak için.[6] Bu, statik yazmanın büyük bir kod gövdesinin korunmasına yardımcı olduğu "bir komut dosyası" ndan "bir uygulamaya" dönüştüğü için, bir uygulamanın yaşam aşamalarının arzu edilen bir özelliği olarak kabul edilir.

#lang daktilo / raket;; Daha yüksek sıralı tekrar yazmayı kullanma(tanımlama türü Str-or-Num (U Dize Numara))(: tog ((Listesi Str-or-Num) -> Dize))(tanımlamak (tog l)  (uygulamak string-append (filtre dize? l)))(tog (liste 5 "Merhaba " 1/2 "dünya" (sqrt -1)))

Tembel Raket

tembel dil ile bir dil tembel değerlendirme anlambilim, benzer Haskell. Aşağıdaki örnekte, lifler çıktı için değeri gerekene kadar 1000'inci elemanı hesaplanmayacak sonsuz bir listedir.

#lang tembel;; Sonsuz bir liste:(tanımlamak lifler  (liste* 1 1 (harita + lifler (cdr lifler))));; 1000. Fibonacci numarasını yazdırın:(Yazdır (liste referansı lifler 1000))

Mantık programlama

Raket üç ile gelir mantık programlama diller: Racklog, a Prolog benzeri dil; a Veri kaydı uygulama; ve bir miniKanren Liman. Karalama sözdiziminden farklı olarak, bu dillerden ilk ikisi S-ifadelerinin bir uzantısı yerine tamamen yeni bir sözdizimi kullanır. DrRacket'te kullanırsanız, uygun vurgulama sağladığını, araçların her zamanki kontrol sözdizimini ve bir Prolog / Datalog REPL sağladığını göreceksiniz.

#lang veri kaydıAta(Bir, B) :- ebeveyn(Bir, B).Ata(Bir, B) :-  ebeveyn(Bir, C), D = C, Ata(D, B).ebeveyn(John, Douglas).ebeveyn(bob, John).Ata(Bir, B)?

Eğitim araçları

Racket'i geliştiren PLT grubu, geleneksel olarak tüm seviyelerde eğitime dahil olmuştur. Grubun teşvik ettiği en eski araştırma fikirlerinden biri, yeni öğrencileri sınırlandıran ve onlara öğrencinin bilgi seviyesine uyan yararlı hata mesajları sağlayan dil seviyelerinin kullanılmasıdır. Bu yaklaşım, Programlar Nasıl Tasarlanır, birkaç PLT geliştiricisinin yazdığı ders kitabının yanı sıra ProgramByDesign proje. Aşağıdaki program, htdp / bsl- "başlangıç ​​öğrenci dili". Kullanır 2htdp / resim öğretim dillerinde resim oluşturmak için kütüphane ve 2htdp / evren etkileşimli animasyonlar için kitaplık.

#lang htdp / bsl;; Herhangi bir tuş balonu şişirir(gerek 2htdp / resim)(gerek 2htdp / evren)(tanımlamak (balon b) (daire b "katı" "kırmızı"))(tanımlamak (patlamak b k) (+ b 5))(tanımlamak (söndürmek b) (max (- b 1) 1))(büyük patlama 50 (anahtar üzerinde patlamak) (iş başında söndürmek)          (çizmek balon 200 200))

Algol

Racket tam bir uygulama ile birlikte gelir. ALGOL 60 dil.

#lang algol60başla  tamsayı prosedür SIGMA(x, ben, n);    değer n;    tamsayı x, ben, n;  başla    tamsayı toplam;    toplam := 0;    için ben := 1 adım 1 a kadar n yapmak      toplam := toplam + x;    SIGMA := toplam;  son;  tamsayı q;  printnln(SIGMA(q*2-1, q, 7));son

Plai ve plai tipli

 #lang Plai
 #lang plai tipli

Desteklenen bir başka dil de, raket gibi yazılabilen veya yazılamayan plai'dir. "Plai ile yazılmış modüller her tanımı aktarır (şemadan farklı olarak)." [7] "Typed PLAI dili, geleneksel Racket'ten en önemlisi statik olarak yazılmasıyla farklıdır. Ayrıca size bazı yararlı yeni yapılar sunar: define-type, type-case ve test." [8]

Ek diller

Son olarak, aşağıdaki örnek bir uygulama yeni bir dilin:

#lang raket(sağlamak (hariç (tamamen dışarı raket)                     #%üst % uygulama)         (yeniden adlandır [üst #%üst] [uygulama % uygulama]))(sözdizimi kuralı tanımla (üst . x) 'x)(sözdizimi kuralı tanımla (uygulama f . xs)  (Eğer (esrar? f) (hash-ref f . xs) (f . xs)))

Bu dil:

  • her şeyi sağlar raket dil, dolayısıyla biraz benzer bir değişken,
  • Bağlantısız değişken arama ve işlev çağrılarını uygulayan iki özel "kanca makro" dışında bunlar yerine, yeni formlar
    • tüm bilinmeyen değişkenleri örtük olarak alıntılayın
    • karma tabloların işlev olarak kullanılmasına izin verin, burada bağımsız değişkenler karma tablo araması için kullanılır.[9]

Bu kod bir mylang.rkt dosyasını aşağıdaki gibi kullanabilirsiniz:

#lang s-exp "mylang.rkt" ; mylang semantiğini kullanarak sexpr sözdizimi(tanımlamak h (hasheq yapmak))(hash-set! h Bir B)        ; A ve B burada kendi kendini değerlendiriyor(h Bir)                    ; karma tablo bir işlev olarak kullanılır

Referanslar

  1. ^ Tobin-Hochstadt, S .; St-Amour, V .; Culpepper, R .; Flatt, M ​​.; Felleisen, M. (2011). "Kitaplıklar Olarak Diller" (PDF). Programlama Dili Tasarımı ve Uygulaması.
  2. ^ a b Gezegen: Racket'in merkezi paket dağıtım sistemi
  3. ^ "Racket'in Grafik Katmanını Yeniden Oluşturma". 2010-12-08. Arşivlenen orijinal 2013-05-23 tarihinde. Alındı 2013-07-07.
  4. ^ Barzilay, E. (2009). "Karalama Okuyucu" (PDF). Şema ve Fonksiyonel Programlama.
  5. ^ Tobin-Hochstadt, S .; Felleisen, M. (2008). "Yazılmış Şemanın Tasarımı ve Uygulanması". Programlama Dillerinin İlkeleri.
  6. ^ Tobin-Hochstadt, S .; Felleisen, M. (2006). "Diller Arası Geçiş: Komut Dosyalarından Programlara". Dinamik Diller Sempozyumu.
  7. ^ http://docs.racket-lang.org/plai/plai-scheme.html?q=plai
  8. ^ Krishnamurthi, Shriram. "Programlama Dilleri: Uygulama ve Yorumlama." Programlama Dilleri: Uygulama ve Yorumlama. Brown Üniversitesi, n.d. Ağ. 14 Mart 2016. <http://cs.brown.edu/courses/cs173/2012/book/ >.
  9. ^ Bunu not et % uygulama tüm işlev çağrılarında kullanılan bir makrodur ve her işlev çağrısı ek bir koşul içerdiğinden bu dili çok verimli kılar. Ek olarak, makro fonksiyon ifadesini iki kez değerlendirir, bu nedenle iyi bir makro programlamaya örnek olarak alınmamalıdır.
  • İtibariyle bu düzenleme, bu makale şuradan içerik kullanıyor: "Raket", altında yeniden kullanıma izin verecek şekilde lisanslanmıştır. Creative Commons Attribution-ShareAlike 3.0 Unported Lisansıama altında değil GFDL. İlgili tüm şartlara uyulmalıdır.

Dış bağlantılar