11 puan yazan GN⁺ 2025-01-13 | 2 yorum | WhatsApp'ta paylaş

Hoşça kal, Clojure

  • Yaklaşık 7 yıl boyunca Clojure kullandım, ancak CLI uygulamalarındaki "yavaş başlangıç hızı" sorunu nedeniyle artık memnun değildim
  • babashka gibi projeler vardı, ancak GraalVM'nin native-image gibi araçlarıyla bile yavaş başlangıç hızını çözmek zordu
  • "Tek başına çalışabilen ikili dosyaların hızlı açılış süresi" vazgeçilmez bir gereksinim haline geldi ve Clojure'un bunu karşılamadığına karar verdim

Yeni bir Lisp arayışı

  • Yeni bir Lisp dili bulmak için çeşitli dilleri inceledim. Mevcut projelerde yaşadığım sorunları çözebilecek bir dil aradım
  • "Açıkça tanımlanmış gereksinimler" olmasa da, sonuçta aşağıdaki ölçütleri netleştirdim
    • "Bağımsız çalışabilen ve hızlı başlayan çalıştırılabilir dosyalar" makul bir toolchain ile üretilebilmeliydi (Clojure'daki temel şikayetimi çözmek için)
    • Emacs kullanamadığım için, Vim'de kullanılabilir olmalıydı
    • Windows ve Mac desteği şarttı; yalnızca Linux/POSIX işletim sistemlerini desteklemesi yeterli değildi
    • Clojure ve Java örneğinde olduğu gibi, başka büyük topluluk dilleriyle eklenti düzeyinde birlikte çalışabilmesi iyi olurdu
    • Çalışma zamanı hızı yeterince yüksek olmalıydı (tercihen en az Clojure seviyesinde)
    • Multithreading desteği güçlü olmalıydı ve mümkünse GIL (Global Interpreter Lock) benzeri bir şey olmamalıydı
    • Güçlü bir topluluk şarttı
    • Zengin bir ekosisteme sahip olmalıydı ve en azından şu kütüphaneler bulunmalıydı:
      • JSON ayrıştırma ve serileştirme
      • Sqlite3 desteği
      • HTTP istek kütüphanesi
      • Clojure benzeri işlevsel veri yapıları desteği (ama bu kısım daha az önemliydi)
  • İncelediğim diller
    • Scheme : r6rs ve r7rs yüzünden standart sorunu nedeniyle topluluğu bölünmüş görünüyordu, bu yüzden bana cazip gelmedi; ayrıca ekosistemi küçüktü ve ihtiyaçlarımı karşılamıyordu
    • Racket : Öğrencilik yıllarımda kullandım, ancak çalışma zamanı yavaş ve ağır hissettirdiği için tercih etmedim
    • Common Lisp : lisp-lang.org'da keşfettim. Topluluğu ve kaynakları etkileyiciydi, bu yüzden denemeye karar verdim

Magic Happens Here

  • Common Lisp öğrenme yolculuğumun tüm hikayesini atlıyorum, ancak öğrenme süreci zorluydu
    • Başlangıç kötüydü. Noel'de CLtLv2 kitabını hediye aldım ve onu okuyarak başladım
    • Sonrasında HyperSpec'i keşfettim ve okumaya başlayınca öğrenme çok daha iyi bir yöne girdi
  • Common Lisp'in bazı benzersiz özellikleri vardı
    • Standartlaştırılmış bir dil; bu yönüyle Java'dan çok C'ye benziyor
    • Birden fazla derleyici, yorumlayıcı ve runtime bu standardı uyguluyor
    • Çeşitli implementasyonları kurup yönetmeye yarayan Roswell gibi araçlar mevcut
    • Toplulukta en popüler implementasyonun SBCL olduğu düşünülüyor
  • Araştırmaya başlarken Janet'i bilseydim ne olurdu?
    • Janet, aşağıdaki özellikleri sayesinde muhtemelen Common Lisp'i öğrenmeden önce beni tatmin edebilirdi
    • Kısa ve öz sözdizimi, hızlı ve küçük çalıştırılabilir dosyalar, C FFI desteği
    • Eğlenceli bir başlangıç rehberi var
    • Benim için önemli olan tüm gereksinimleri karşılıyor
  • Yine de neden Common Lisp'i seçtim
    • Sonradan öğrendiğim CLOS ve Condition System gibi gelişmiş özellikleri kaçırmış olurdum
    • Common Lisp daha güçlü bir dil

Gereksinimler karşılandı

Common Lisp'in gereksinimlerimi karşılayan bir dil olduğunu gördükten sonra onu bir sonraki Lisp dilim olarak seçtim ve hâlâ kullanıyorum. Başlıca gözlemlerim şunlar:

  • Bağımsız çalıştırılabilir dosyalar:
    • Common Lisp'te bağımsız çalıştırılabilir dosyalar üretmenin çeşitli yolları var
    • Dosyaların başlangıç süresi, sıkıştırılıp sıkıştırılmadıklarına bağlı olarak saniyenin küçük bir kısmından neredeyse anında çalışmaya kadar değişebiliyor
    • Bu özellik ek bir seçenek değil; Lisp programlarını dağıtmanın ana yöntemlerinden biri olarak tasarlanmış
  • Vim iş akışı:
    • Pek çok iyi seçenek var, ancak ben kişisel olarak kendi Vim iş akışımı kurup kullanıyorum
    • Ayrıca VS Code'un Common Lisp IDE'si olarak kullanılabilecek kadar iyi olduğunu da gördüm
  • Windows/Mac/Linux desteği:
    • SBCL başlıca işletim sistemlerini iyi destekliyor
  • Büyük imperative ekosistemlerle entegrasyon:
    • Çoğu implementasyon C diliyle entegrasyonu iyi destekliyor ve bu, CFFI üzerinden kullanılabiliyor
  • Çalışma zamanı hızı:
    • SBCL'in çalışma zamanı performansı çok hızlı
  • Multithreading:
    • Common Lisp standardı multithreading için açık bir destek içermese de başlıca implementasyonlar bunu destekliyor
    • Bordeaux-Threads adlı kütüphane, farklı implementasyonlar arasındaki farkları azaltıyor
    • lparallel, cl-async, blackbird gibi kütüphanelerle multithreading ve asenkron programlama yapılabiliyor
  • Güçlü topluluk:
    • Topluluk etkinliklerini keşfettim ve katılmaya başladım
    • 2024 topluluk anketi sonuçları ve European Lisp Symposium üzerinden Common Lisp topluluğunun ne kadar canlı olduğunu gördüm
    • Blog ağı ve subreddit tarafında da topluluk desteği güçlü
  • Ekosistem:
    • Çoğu kişi Quicklisp kullanıyor, ancak ben paket yönetimi için kişisel olarak OCICL kullanıyorum
    • Common Lisp Cookbook, CLiki, Awesome CL gibi kaynaklardan kütüphaneler ve teknik bilgiler keşfedilebiliyor
    • Belirli kütüphane desteği:
      • JSON: jzon
      • Sqlite3: cl-sqlite
      • HTTP istekleri: dexador
      • İşlevsel veri yapıları: FSet, cl-hamt

Yeni gelenler için notlar

  • Common Lisp Discord'unda yeni başlayanların sayısı arttığı için, Common Lisp'i neden seçtiğimi ve ona nasıl adapte olduğumu paylaşmak amacıyla bunu yazdım
  • Umarım bu yazı Common Lisp'e ilgi duyanlara yardımcı olur

2 yorum

 
GN⁺ 2025-01-13
Hacker News görüşleri
  • SBCL kullanarak kaynak kod olmadan da bir sorunu çözmüş olması etkileyiciydi. Başka bir teknoloji yığınıyla, kaynak kod yokken bunu bu kadar hızlı düzeltemezdi

    • SBCL çok dinamik bir sistem ve kaynak kod olmadan bile REPL üzerinden sorun çözülebiliyordu
  • Common Lisp'ten Clojure'a geçiş deneyimini paylaşıyor; Clojure'un eşzamanlılık özellikleri cazipti

    • babashka, hızlı betikler yazarken faydalı olmuştu
  • vim-slime kullanarak üretkenlik ve geliştirici memnuniyeti ciddi ölçüde artmıştı

    • Çeşitli dillerde REPL kullanabilmek faydalı
    • doom-emacs da vim'e benzer şekilde üretkenliği artırabiliyordu
  • Lisp'in değerini anlayamamıştı ama onunla ilgili bir şarkıyı hatırlıyor

  • Emacs/slime'ın vim-slime'dan daha iyi bir Lisp IDE'si olduğunu savunuyor

    • Emacs'te tuş eşlemelerini değiştirerek RSI sorununu çözebilmişti
  • Common Lisp'i hobi olarak kullanıyor ve SBCL REPL içinde C# kodu çalıştırmak istiyor

    • Geri bildirim döngüsü çok hızlı ve sorunlar anında çözülebiliyor
  • Clojure ve babashka ile CLI uygulamaları geliştirme deneyimini paylaşıyor

    • methodical kütüphanesiyle performansı iyileştirebilmişti
  • native-image kullanırken sorun yaşamıştı ve Clojure'un neredeyse kusursuz bir dil olduğunu düşünüyor

  • Janet diline ilgisini dile getiriyor; projenin GitHub README ve FAQ bölümlerinin faydalı olduğunu belirtiyor

  • Özellikle bir vim hayranı olan yazarın etkisiyle, kendisine Lisp öğrenme isteği uyandıran deneyimini paylaşıyor

 
gurugio 2025-01-13

Lisp'in değerini anlayamadım ama onunla ilgili şarkıları hatırlıyorum... Lisp hakkında çok şarkı var; YouTube'da Land of Lisp diye bir şarkı da var ;-)