Racket programlama dili
(racket-lang.org)- Racket, dil odaklı programlamayı merkezine alan olgun bir dil olup, genel uygulama geliştirme ile yeni diller oluşturmayı aynı ekosistem içinde ele alır
- Temelinde makrolar ve
#langvardır; yeni sözdizimleri, alan özel dilleri ve mevcut yüzey sözdizimleri kütüphane gibi oluşturulup modül düzeyinde kullanılabilir - Web sunucusu, veritabanı, matematik ve istatistik, GUI, bilimsel simülasyonlar dahil standart kütüphane ve binlerce paket, genel amaçlı geliştirme kapsamını genişletir
- Typed Racket, contract'lar, nesne sistemi ve DrRacket IDE birlikte sunulur; böylece işlevsel kod, nesne yönelimli bileşenler ve kademeli tipler ihtiyaca göre birleştirilebilir
- Racket yalnızca basit bir Lisp ailesi dili değil; her problem alanına uygun diller üretmeyi ve bunu çalıştırma, düzenleme ve araç desteğiyle bağlamayı hedefleyen bir geliştirme ortamına daha yakındır
Dil odaklı programlama için Racket
- Racket, “Racket, the Programming Language” ve “Racket, the Language-Oriented Programming Language” söylemlerini birlikte öne çıkaran bir programlama dilidir
- Racket version 9.2 kullanılabilir durumdadır
- İlk dönemlerinden beri Windows, macOS ve Linux üzerinde çapraz platform grafik programlama desteği sunan olgun bir üründür
- Temel geliştirme özellikleri; paket yönetimi, GUI, bağımsız çalıştırılabilir ikililer ve harici arayüzleri kapsar
Genel uygulama geliştirme kapsamı
- Racket, web sunucusu uygulamalarından matematik ve bilimsel simülasyon yazılımlarına kadar uzanan kütüphane paketi sunar
- Öne çıkan belgeler ve kütüphane kapsamı şöyledir
- Çapraz platform GUI araç takımı ve web sunucusu temel ekosisteme dahildir
- Binlerce ek paket tek bir komutla kurulabilir
- Örnekler arasında 3D graphics, Bluetooth socket connector, color maps, data structures, educational software, games, quantum-random number generator, scientific simulations ve web script testing yer alır
#lang racket/guiörneği, GUI lehçesiyle küçük bir sayı tahmin oyunu uygular ve birden fazla dil özelliğini birlikte kullanır
Makrolarla genişleyen dil
- Racket programcıları makrolar ile kendi yineleme yapıları ve yeni sözdizimlerini tanımlayabilir
- Yeni sözdizimleri; prosedür, metot ve sınıf gibi eklenir; özel sözdizimini Racket ifadelerine veya tanımlarına yeniden yazan kurallar oluşturmak yeterlidir
- Küçük makrolar, başka yollarla ele alınması zor olan tekrarlı kodun kaldırılmasına yardımcı olur
- Çalışma süresini ölçen
time-itsözdizimi tanımlanabilir - Tekrarlayan
lambdakullanımından kaçınılabilir - Makrolar normal fonksiyonlar gibi modüllerden export edilir
- Çalışma süresini ölçen
- Tüm makro sistemi, birden çok makronun birlikte çalıştığı yapılar kurmayı da mümkün kılar
- Racket işlevsel bir dil olsa da, en baştan classes and objects, mixins and traits alt dilini sunar
- Java'ya benzer sınıf sistemi, çekirdek dilde ayrı bir destek olmadan çalışan makro tabanlı bir kütüphane olarak uygulanmıştır
#lang ve alan özel dilleri
- Racket, programcıların her modülü uygun dilde yazabilmesini sağlamak için dil yapan bir dil olmayı hedefler
#lang typed/racketörneği,StringveNumberiçin union type, occurrence typing ve liste filtrelemeyi kullanır#lang scribble/baseörneği, PDF veya HTML belgeleri üreten bir belge dilini ele alır#lang datalogörneği,parentveancestorilişkilerini tanımlayıp sorgulayan Datalog sözdizimini kullanır- Yeni diller bir IDE penceresinde oluşturulabilir ve başka bir IDE penceresinde bu dilin modülleri çalıştırılabilir; ayar, proje dosyası veya harici araç gerekmez
- Racket kullanıcıları çoğunlukla parantezli sözdizimi kullanır, ancak Datalog'da olduğu gibi virgül ve süslü parantez gerektiren mevcut yüzey sözdizimleri de oluşturulabilir
- parsing packages kullanılarak rastgele bir dilbilgisi parantez tabanlı dile eşlenebilir ve Racket makro sistemiyle genel Racket'e derlenebilir
DrRacket ve geliştirme ekosistemi
- Racket, kendi IDE'si olan DrRacket ile gelir; tanımlayıcıların üzerine fareyle gelindiğinde tanım konumuna ok çizen bir özellik sunar
- Typed Racket gibi alternatif diller kullanıldığında da DrRacket'in düzenleme desteğinden yararlanılabilir
- Racket makroları, karmaşık makrolar ya da yeni diller üreten makrolarda bile yeterli kaynak bilgisi kaydedip aktararak DrRacket'in yeni dil özelliklerini anlıyormuş gibi davranmasını sağlar
- Başlıca geliştirme destekleri şunlardır
- Ekosistem kaynakları; indirme, kaynak kod, hata raporları, nightly snapshot builds ve paket deposunu içerir
- Öğrenme materyalleri ve belgeler olarak Quick Introduction, The Racket Guide, The Racket Reference ve All Documentation sunulur
- Topluluk kanalları arasında Discourse, Discord, Slack, Reddit, mailing lists, Mastodon, Twitter, Blog, Wiki ve YouTube bulunur; ayrıca Team ve Contributing belgeleri de sağlanır
1 yorum
Hacker News görüşleri
Racket’ın ilk sayfaya çıktığını görmek sevindirici. 1982’den beri araştırma amaçlı programlamada çoğunlukla Common Lisp kullandım, ama son zamanlarda Racket’a daha sık yöneliyorum.
Racket’ta hoşuma gitmeyen yanlar da var; derleyici, paket yönetim sistemi, GUI IDE, Emacs bağları ve yazması keyifli bir dil olması dışında neredeyse her şey.
Programlama dili araştırmaları tarafındaki ekosisteme pek ilgi duymuyorum; muhtemelen projeyi yöneten bilgisayar bilimi profesörlerinin en çok önem verdiği kısım da odur. Yine de başarılı olmalarını dilerim.
Bu yüzden Racket projesinden bedavaya yararlanıyormuşum gibi de hissediyorum. Sevdiğim küçük kısımların tadını çıkarıp geri kalanını görmezden geliyorum, katkım da neredeyse yok. Yalnızca yazdığım küçük Racket kitabı buna bir istisna sayılabilir.
Bu özellikler gerçekten kullanışlı ve önemli. Lisp’i seviyorum ama işte bir dili yalnızca o iş için en uygun araç olduğunda kullanıyorum. Bu özellikler sayesinde Racket, kullanımını gerçekten gerekçelendirebildiğim tek Lisp oldu.
Topluluğu, araçları ve öğrenme materyalleri sayesinde Racket, kişisel olarak başkalarına önermesi kolay bir dil. CL ve Clojure’u da çok kullandım ve sevdiğim yanları var, ama her birinin büyük dezavantajları olduğu için başkalarına önermiyorum.
Ben de dilin araştırma tarafına ya da
langözelliğine pek uygun değilim; HtDP’den de epey hoşlanmıyorum. Ama bunları, sevdiğim bir dille yapılmış, ilgimi çekmeyen projeler olarak görüyorum; dilin kendisinin eksileri değil. Çünkü pratikte bunlarla neredeyse hiç karşılaşmıyorum.Bence bu kadarı büyük bir katkı sayılır :)
Dilin kendisinde metaprogramlama özellikleri var, ama modern dillerin hepsinde metaprogramlama var.
Topluluktaki deneyimim çoğunlukla gerçek sorunları konuşan insanlardan oluşuyordu.
Racket programlama dili araştırmalarında ya da başka araştırmalarda kullanıldığı için ilgili makalelerde ve konferans sunumlarında Racket’tan bahsediliyor, ama tartışmaya hâkim değil.
Örnek: https://racket.discourse.group/t/levin-tree-search-with-cont...
Öte yandan Clojure’un topluluğu daha büyük ve daha sağlam. Buna karşılık JVM kullandığı için kurulum biraz daha zahmetli ve ince ince dikkat edilmesi gereken şeyler de daha fazla.
Racket son derece pratik bir dil. Akademik bir garip zevk gibi görünüyorsa Bogdan Popa’nın Racket ile neler yaptığına bakmak iyi olur: https://defn.io/
Kişisel olarak yerel GUI’si olan bir ikili dosyaya ihtiyacım olduğunda Racket kullanıyorum. JSON, XML ve metin dosyası biçimleri gibi şeyleri ayrıştırmak için de oldukça iyi.
Birlikte okunabilecek How to Design Programs kitabı, https://htdp.org/2023-8-14/Book/index.html da iyi. Tam olarak Racket öğreten bir kitap değil; Racket ile uygulanmış birkaç eğitim amaçlı dil kullanıyor, ama ara sıra dönüp düşünmeye değer fikirler içeriyor.
Makro sistemi CL gibi yerlerden gelen birine garip görünebilir; ama alıştıktan sonra metaprogramlama yaparken akıl sağlığını görece korumayı kolaylaştırdığını gördüm.
Birkaç yararlı kaynak daha:
https://www.greghendershott.com/fear-of-macros/
https://beautifulracket.com/
Racket adlı dili gerçekten seviyorum ama dayatılan çalışma akışını kabullenmek zor. Python ile kod yazarken kodu editörde yazıp kabukta çalıştırıyorum
Racket’ın başlangıç süresi çok uzun olduğu için bu pek iyi işlemiyor. Bunun yerine uzun süre çalışan bir sanal makine ve REPL ile etkileşime girmeniz gerektiği söyleniyor
Ama o zaman üzerinde çalıştığınız kod temiz bir durumdan değil, o anda sanal makinenin sahip olduğu durumdan başlıyor. Jupyter Notebook gibi şeyler için harika bir akış, fakat büyük programlara pek uygun olmadığını düşünüyorum
racketyerineracket/base#langkullanmak da büyük fark yaratıyor. Ayrıntılar https://docs.racket-lang.org/style/Language_and_Performance.... adresinde“Temiz durumdan” başlamama meselesi Racket’tan çok Common Lisp tarzı REPL’e daha yakın görünüyor. Racket’ta genelde bir dosyayı ya da modülü yeniden yüklerken Racket’ı yeniden başlatmanız gerekir, böylece taze bir ortamınız olur. İnsanlar bundan şikâyet ediyor ama ben CL’ye kıyasla Racket’ın temiz durum yaklaşımını tercih ediyorum
https://docs.racket-lang.org/drracket/drracket-files.html#(p...
Muhtemelen geri yükleme önerisi de reddedilebilir
“DrRacket ilk başlatıldığında geride kalmış yedek dosya olup olmadığını kontrol eder ve varsa yedek dosyayı geri yüklemeyi teklif eder”
University of British Columbia’da okurken, bilgisayar bilimine giriş dersinde Racket öğretiliyordu. Harika bir dil olduğunu düşünmüştüm; önceki programlama deneyimi olan öğrencilerin bile Lisp’i denemiş olması çok nadirdi, bu yüzden herkesi aynı başlangıç çizgisine getiriyordu
Basit oyunlar veya görselleştirmeler yapmayı kolaylaştıran kütüphaneler de etkileyiciydi
Asistanlık yaptığımda ikinci sınıfa geçen öğrencilerin önemli bir kısmı hâlâ for döngüsü bile yazamıyordu ve temel algoritmalarda ciddi biçimde gerideydi
Fonksiyonel dillere yönelik daha derin bir takdir ancak dördüncü sınıftaki hesaplama kuramı dersinden sonra oluştu
Racket’ın tüm bu “dillerini” tek bir uygulamada nasıl birleştirmek gerektiğini bilmiyorum.
typed/racket,racket/gui,scribble/basegibi diller görüyorum; tipli kodla bir GUI uygulaması yapıp aynı zamanda PDF üretmek istiyorsam nasıl yapacağımı kestiremiyorumRacket eğitimlerini birkaç kez takip ettim ama birbirinden bağımsız görünen bu “dilleri” nasıl bağlamak gerektiği hâlâ kafamı karıştırıyor
Bana göre eğitimdeki her bölüm ilgisiz bir “dili” anlatıyor ve bunların birlikte çalıştığı bir örneği hiç göstermiyor. Bir bölüm web sunucusunu ele alıyor ama sınıf sistemine değinmiyor; başka bir bölüm sınıfları destekleyen farklı bir “dili” anlatıyor ama orada web sunucusu yazmıyor
#langsatırını, kapsamı o dosya olan bir tür derleyici yönergesi gibi düşünebilirsiniz. Gerçekte bundan çok daha fazlası var ama başlangıç noktası olarak fena değil. Uygulamanıza tip eklemek istiyorsanız bunu dosya dosya yapmak iyi bir strateji#langsatırının dışında,requireile kütüphaneleri içe aktarabilirsiniz; yani GUI kodu ile web sunucusu kodunu aynı dosyaya koymanız da mümkün.#langde tek seferde yalnızca tek bir dille sınırlı değil; çakışma yoksa o satıra daha fazlasını ekleyebilirsiniz"racket"diliyle yazmanız muhtemel. Tiplere çok önem veriyorsanız önemli bir kısmı"typed/racket"olabilirTüm dillerin ortak bir temeli paylaştığı ve bir ölçüde birlikte çalışabildiği doğru; ancak programı beş eşit parçaya bölüp her birinde farklı bir dil kullanmanız hiç de olası değil. Belgeleri muhtemelen scribble ile yazarsınız
Farklı diller kullanmak temelde farklı programlama modelleri sunabilir ve Typed Racket gibi geliştirmelerin mümkün olmasının arkasındaki nedenlerden biri de bu; ama bu, başlamayı engelleyen bir unsur olmamalı
Özetle, sadece Racket kullanın. Gerçekten başka bir özelliğe ya da programlama stiline ihtiyaç duyduğunuzu hissederseniz, o zaman zaten sunulan bir dil var mı diye bakarsınız. Elbette bunların hepsi benim görüşüm
Bu web sitesi Hacker News Arc ile yazıldı ve Racket üzerinde çalışıyor: https://en.wikipedia.org/wiki/Arc_(programming_language)
Racket’ın en büyük sorunu dil ya da ekosistem değil: https://news.ycombinator.com/item?id=27531508
O bağlantıyı tamamen göründüğü gibi kabul edip Felleisen’ın belirli kişisel etkileşimlerde Torvalds tarzı kaba davrandığını varsaysak bile, How To Design Programs dahil çalışmaları benim hayatımda ve başkalarının hayatında çok olumlu etki yarattı. Bu yüzden insanlara ondan yararlanmamalarını söylemem
Toplulukta güçlü görüşleri olan “garip nerd”ler de var; daha görünür oldukları ölçüde daha can sıkıcı gelebiliyorlar. Ama düzeni para tutmadığında birçok sosyal alan genel olarak böyle oluyor; durum bu
Racket en sevdiğim dil. Hızlı ve pratik, sağlam bir temeli var ve eşzamanlılık modeli de çok iyi. Concurrent ML’den alınan ve genişletilen kavramlara dayanıyor.
Dokümantasyon sistemi de harika ve paket ekosistemiyle entegre; bu yüzden çoğu paketin çapraz referansları olan yüksek kaliteli dokümantasyonu var. Geriye dönük uyumluluğu da mükemmel; şu an asıl işimde kullandığım Python’dan çok daha iyi olduğunu düşünüyorum.
Bu yüzden Racket’ın fazla akademik ya da pratik olmadığını söyleyenlerin muhtemelen yeterince derine inmediğini ya da geçmişte yalnızca eğitim amaçlı dillerle karşılaşmış öğrenciler olduğunu hissediyorum.
Elbette mükemmel değil. Topluluk küçük, çalışma zamanının varsayılan bellek kullanımı yüksek ve paralel işlem yapmak için her sistem iş parçacığı başına bir Racket VM çalıştırmak gerekiyor gibi sorunlar var. Yine de bunlar zamanla iyileşecektir.
Son birkaç yılda Racket ile yaptıklarım: bir e-ticaret sitesi[1], App Store’da yayımlanan yerel macOS/iOS hatırlatma uygulaması[2, 3, 4], Apache Kafka için çapraz platform masaüstü istemcisi[5, 6, 7], Lua için
#lang[8]. Bunların dışında da[9][10][11] çeşitli şeyler var. Bence oldukça pratik işler.[1]: https://defn.io/2019/08/20/racket-ecommerce/
[2]: https://defn.io/2020/01/02/ann-remember/
[3]: https://defn.io/2024/04/09/ann-remember-for-ios/
[4]: https://github.com/bogdanp/remember
[5]: https://defn.io/2022/11/20/ann-franz/
[6]: https://defn.io/2023/10/15/ann-franz-for-windows/
[7]: https://defn.io/2023/08/10/ann-franz-source-available/
[8]: https://defn.io/2022/11/12/ann-racket-lua/
[9]: https://docs.racket-lang.org/http-easy/index.html
[10]: https://docs.racket-lang.org/deta/index.html
[11]: https://docs.racket-lang.org/gui-easy/index.html
Topluluk forumlarında da çok aktif ve gerçekten çok sayıda faydalı yanıt veriyor.
Bu dilin gizli kahramanlarından biri olduğunu düşündüğüm için özellikle belirtmek istedim. Kütüphanelerinizin, hiçbir şey bilmeyen kullanıcıların hayatını çok daha kolaylaştıran kodları çalıştırdığını söyleyebiliriz :)
https://docs.racket-lang.org/http-easy/index.html
https://docs.racket-lang.org/gui-easy/index.html
https://racket.discourse.group
Bu, Python’ın bugün ağırlıklı olarak kullanıldığı alanlardan kaynaklanıyor olabilir. 2000 civarındaki Numeric/Numpy geçişi tamamen farklıydı.
Birkaç yılda bir kırılmalar, unicorn startup’lar ya da hızlı hareket edip kelimenin tam anlamıyla bir şeyleri bozan şirketler için sorun olmayabilir. Ama birkaç yılda bir olgun algoritmaları yeniden yazmaya vakti olmayan ya da bunu öncelik olarak görmeyen kişiler ve kuruluşlar için de değerli pek çok program var
Racket’ı ara sıra kullanıyorum ve seviyorum. Ancak bazı Lisp’lerin, özellikle Common Lisp’in ve muhtemelen Guile’ın da sanılandan daha az değer gördüğünü fark ettim.
Daha iyi bilenlere sormak isterim: İlk bakışta pratik, ilgili ya da faydalı görünmeyen ama kullanınca programlamada beklenmedik biçimde işe yarayan Racket özellikleri neler olabilir?
Yaklaşık 20 yıl önce, MzScheme PLT Scheme olmadan önce, onu temel dil olarak kullanan ticari bir e-posta güvenlik yazılımı üzerinde çalışmıştım. Kod Solaris, Linux ve HP-UX üzerinde çalışan çapraz platform bir yapıdaydı; işletim sistemine özgü kod C ile yazılmış yaklaşık bin satır kadardı.
Filtre kuralları doğrudan Scheme’e derleniyordu. Web tabanlı kullanıcı arayüzü dâhil tüm kod yaklaşık 30 bin satırdı ve geliştirici sayısı yalnızca 5-6 kişiydi.
Daha sonra göç ettikten sonra benzer ama daha az özellikli bir ürünü olan bir şirkete girdim; o ürün C++ ile yüz binlerce satırdı ve geliştirici sayısı da daha fazlaydı.