2 puan yazan GN⁺ 2024-04-22 | 1 yorum | WhatsApp'ta paylaş
  • 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 #lang vardı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-it sözdizimi tanımlanabilir
    • Tekrarlayan lambda kullanımından kaçınılabilir
    • Makrolar normal fonksiyonlar gibi modüllerden export edilir
  • 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, String ve Number iç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, parent ve ancestor iliş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

 
GN⁺ 2024-04-22
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 söylenenlerin neredeyse tamamına katılıyorum. Paket yönetim sistemi, adım adım hata ayıklayıcı içeren GUI IDE, Racket çekirdek ekibinin doğrudan yönettiği çapraz platform IDE yazabilme becerisi ve çalıştırılabilir ikilileri kolayca üretme özelliği sayesinde Racket benim en sevdiğim Lisp.
      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.
    • https://leanpub.com/racket-ai/read
      Bence bu kadarı büyük bir katkı sayılır :)
    • CL’yi günlük olarak kullanıyorum; araştırma ya da programlama dili araştırması alanında değilim. Racket’ı henüz denemedim; CL ile karşılaştırınca Racket’ta hoşuna gitmeyen kısımları biraz daha anlatıp anlatamayacağını merak ediyorum.
    • Programlama dili araştırma ekosistemi ile tam olarak ne kastedildiğini merak ediyorum. Racket dağıtımında doğrudan programlama dili araştırması sayılabilecek şey olarak Redex’ten başka pek bir şey görmüyorum.
      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...
    • Üniversitede programlama dili ekosistemi dersinde Racket kullanmıştım; o yönünden ben de pek keyif almamıştım. Yine de Racket’a başlamak kolay ve üzerine düşeni kesinlikle iyi yapıyor. Lisp’e adım atılacaksa kişisel olarak Racket’ın iyi bir başlangıç noktası olduğunu düşünüyorum.
      Ö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/

    • Bogdan tarafında özellikle göze çarpan bir şey var mı? Şöyle bir göz attığımda bana pek çarpıcı gelmedi.
  • 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

    • Kodu editörde yazıp kabukta çalıştırma yöntemi Racket’ta da tamamen geçerli. Benim deneyimime göre başlangıç süresi Python’a oldukça benziyor. Yavaş ama ölümcül değil; özellikle önceden derlerseniz gayet iyi. O anda işi bitmiş dosyalar için kullanışlı
      racket yerine racket/base #lang kullanmak 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
    • “Temiz durumdan” başlamama kısmı, belgelere göre kullanıcının yedek dosya kaydetmeyi açıkça reddedebileceği gibi görünüyor
      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”
    • Smalltalk’ı bir denemek lazım :-))
    • Guile ilginizi çekebilir. Özellikle hata ayıklarken Racket’tan daha sürükleyici bir deneyime yakın ve Common Lisp’e (SBCL) de daha benzer olduğunu düşünüyorum
    • Smalltalk ve Lisp Machines dünyasına hoş geldiniz. Modern IDE’ler bile hot reload, çalışma durumunu kaydetme ve geliştirme yığınının tamamını tek bir dille kontrol etme özelliklerinin hepsini hâlâ düzgün destekleyemiyor
  • 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

    • Ben de UBC’de o dersi aldım ama tamamen farklı bir izlenim edindim. Berbattı ve özellikle daha sonra zorunlu dillerle işlenen veri yapıları ve algoritmalar derslerine hazırlık açısından giriş seviyesindeki öğrencileri çok yetersiz hazırladığını düşünüyorum
      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/base gibi diller görüyorum; tipli kodla bir GUI uygulaması yapıp aynı zamanda PDF üretmek istiyorsam nasıl yapacağımı kestiremiyorum
    Racket 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

    • #lang satı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
      #lang satırının dışında, require ile kütüphaneleri içe aktarabilirsiniz; yani GUI kodu ile web sunucusu kodunu aynı dosyaya koymanız da mümkün. #lang de tek seferde yalnızca tek bir dille sınırlı değil; çakışma yoksa o satıra daha fazlasını ekleyebilirsiniz
    • Geçerli bir soru olduğunu düşünüyorum. Büyük bir uygulama geliştiriyorsanız kodun neredeyse tamamını "racket" diliyle yazmanız muhtemel. Tiplere çok önem veriyorsanız önemli bir kısmı "typed/racket" olabilir
      Tü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
    • Bildiğim kadarıyla her modül için o modülün dilini seçebiliyorsunuz
  • 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

    • Bağlantıda bahsedilen 2018 Racket school öğrencisiydim. Felleisen ve Butterick dahil tüm eğitmenler, sınıf içinde ve dışında gerçekten yardımcı ve nazikti.
      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
    • Bu, tanınmış topluluk üyeleri arasındaki çok kişisel bir anlaşmazlık. Daha geniş Racket topluluğu, çekirdek ekip dahil, çok nazik
    • Felleisen katlanması zor biri ama ondan kaçınmak da kolay. Bunu Racket’ın kendisinden ziyade akademinin patolojilerinin bir belirtisi olarak görüyorum.
      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

    • Bogdan, Racket ekosisteminde vazgeçilmez olan gui-easy ve http-easy’nin de yazarı.
      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
    • Geriye dönük uyumluluk gerçekten önemli bir nokta bence. Python’ı yıllarca yoğun biçimde kullandım ama 2/3 geçişinde çekirdek geliştiricilerin ve topluluğun geriye dönük uyumluluğu ne kadar umursamadığını görünce derinden hayal kırıklığına uğradım; sonrasında da durum düzelmedi.
      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ı.