ClojureScript'e Async/Await eklendi
(clojurescript.org)- ClojureScript 1.12.145 ile derleyici,
^:asyncipucu eklenmiş fonksiyonları JavaScriptasync functionolarak üretecek şekilde değiştirildi awaitile Promise değerlerini bekleyen ClojureScript fonksiyonları yazılabildiği için JavaScript birlikte çalışabilirliği iyileşti- Testlerde de
^:asynckullanılabiliyor veawaitile asenkron fonksiyon çağrılarının sonuçları doğrulanabiliyor - Yakın tarihli Clojure anketinde async functions desteği, JavaScript birlikte çalışabilirliğiyle ilgili ClojureScript iyileştirme talepleri arasında en yüksek paya sahip oldu
- Modern tarayıcı API'leri ve popüler kütüphanelerle çalışılan yaygın durumlarda ek bağımlılık ekleme ihtiyacı azalıyor; değişikliklerin tam listesi ClojureScript changelog içindeki 1.12.145 girdisinde görülebilir
^:async ve await kullanımı
- ClojureScript 1.12.145 ile derleyici,
^:asyncipucu eklenmiş fonksiyonları JavaScript async function olarak üretecek şekilde değiştirildi - ClojureScript'in ECMAScript 2016 hedeflemesiyle birlikte, JavaScript birlikte çalışabilirliğini iyileştirme alanları daha dikkatli seçilebilir hale geldi
awaitkullanarakPromisedeğerlerini bekleyen ClojureScript fonksiyonları yazmak mümkün hale geldi(refer-global :only '[Promise]) (defn ^:async foo [n] (let [x (await (Promise/resolve 10)) y (let [y (await (Promise/resolve 20))] (inc y)) ;; not async f (fn [] 20)] (+ n x y (f))))- Testlerde de
^:asynckullanılabiliyor veawaitile asenkron fonksiyon çağrılarının sonuçları doğrulanabiliyor(deftest ^:async defn-test (try (let [v (await (foo 10))] (is (= 61 v))) (let [v (await (apply foo [10]))] (is (= 61 v))) (catch :default _ (is false))))
Arka plan ve değişiklik listesi
- Yakın tarihli Clojure anketinde async functions desteği, JavaScript birlikte çalışabilirliğiyle ilgili ClojureScript iyileştirme talepleri arasında en yüksek paya sahip oldu
- Bu iyileştirmeyle birlikte, modern tarayıcı API'leri ve popüler kütüphanelerle çalışılan yaygın durumlarda ek bağımlılık ekleme ihtiyacı azalıyor
- Tüm düzeltme, değişiklik ve iyileştirme listesi ClojureScript changelog içindeki 1.12.145 girdisinde görülebilir
- ClojureScript 1.12.145'e topluluk üyesi Michiel Borkent katkıda bulundu
1 yorum
Hacker News görüşleri
borkdude bu başlığı açmış, ayrıca bu sürümün katkıcıları arasında da yer aldığını gördüm
Uzun zamandır async/await desteğine karşı ana argümanlar kabaca iki taneydi: bunun CLJS derleyicisinin geneline derin değişiklikler gerektirmesi ve Promesa gibi kütüphanelerin makrolarla benzer bir kullanım kolaylığı sunması
Bunun dışında core.async kullanmanın yeterli olduğu ya da ifade odaklı bir dilin async/await ile pek iyi uyuşmadığı da söyleniyordu, ama bunlar forumlarda tekrar edilen baskın görüşlerden çok kişisel kanaatlere yakındı
borkdude, Clojurians Slack'te desteğin eklenmesinin gerçek dışı olduğuna kesin gözüyle bakmadığını söylemişti; sonunda zaman ayırıp bunu hayata geçirmiş gibi görünüyor, gerçekten minnettarım
İlginç olan şu ki ClojureScript, JavaScript'in kendisine async/await gelmesinden çok önce core.async kütüphanesiyle asenkron programlama paradigmasını destekliyordu
Bununla bu sürümün değerini küçümsemeye çalışmıyorum; sadece, bağımlılıklara bir kütüphane ekleyerek ana dilde henüz var olmayan yeni bir dil özelliğini kullanabilmenin ne kadar havalı olduğundan bahsediyorum. Clojure gerçekten etkileyici
Sanırım bunu David Nolen'in bir konuşmasından öğrenmiştim
Sonrasında ön yüzde JavaScript'i minimumda tutmaya yöneldim ve SSE tek yönlü olduğu için bu açıdan çok zarif. Bugünlerde farklı dil topluluklarından geliştiricilerin SSE'ye ilgi duyması hoşuma gidiyor
David Nolen'in yakın tarihli “A ClojureScript Survival Kit” sunumu da çok iyiydi: https://youtu.be/BeE00vGC36E
David “Swannodette” Nolen'in ClojureScript ve core.async'in ilk günlerinden beri yaptığı işler için ne kadar teşekkür etsek az. Bu sunumda özellikle şaşırtıcı olan, onun ClojureScript'i bırakıp sunucu tarafında saf Clojure, server-sent events ve çok az miktarda JavaScript kullanılan bir yöne gerçekten heyecanla bakması
Asıl demo yaklaşık 26:30'da başlıyor. İstemcide çalışan web uygulamasının kaynak kullanımını gösterdikten sonra, aynı uygulamayı sunucuda çalıştırıp SSE ile istemciye tek yönlü olarak ittiğini gösteriyor; kaynak kullanımı neredeyse sıfıra indiği için oldukça çarpıcı
Her duruma uymaz ama minimum DOM değişikliği yapan bir kütüphane kullanınca web uygulamasını ve durumunu zihinde modellemek çok daha kolay hale geldi. Eskiden hem Clojure için bir REPL hem de ClojureScript için bir REPL açıp iki yönlü trafiği ve yeniden üretmesi zor durumları uğraşmam gerekirdi; şimdi her şey çok daha hızlı ve yeniden üretmesi daha kolay
JavaScript çıktısı büyüyor, yerleşik bir hata modeli yok ve işler ters gidince okunması ve debug edilmesi zor durum makinesi koduna dönüşüyor
Üstelik
gomakrosu kendi S-ifadesinin dışındaki kodu dönüştüremediği için işlevlerin gereğinden fazla büyümesine yol açıyorCognitect'ten birinin dediği gibi, “core.async güzel bir saçmalık”
Son zamanlarda sosyal medyada Clojure/ClojureScript'i daha sık görmem biraz şaşırtıcı
2012 civarında birkaç yıl işte kullanmıştım ama diğer birçok kişi gibi JVM'den ayrılıp tipli fonksiyonel dillere geçtim
Bugünlerde ilginin artması etken kodlama yüzünden mi? Tip kontrolünün olmaması, daha az yanlış sözdizimi hatası ve daha az ayrılmış sözcük olması nedeniyle kodu gözden geçirmek daha mı hızlı? S-ifadelerinin dönüşü mü geliyor diye merak ediyorum
Bildiğim ciddi Clojure kod tabanları test paketlerine çok yatırım yapıyor; bu yüzden yapay zekaya testleri en etkili şekilde kullanmayı öğreten birkaç teknik eklerseniz oldukça iyi sonuç alabiliyorsunuz
Bazı iş arkadaşlarım etkenleri REPL ile etkileşime sokuyor; her seferinde başlangıç maliyeti ödenmediği için daha hızlı olduğunu söylüyorlar. Ben o kadarına üşendim ama şu haliyle bile yeterince hızlı
Clojure'un ayağa takılan unsurları az.
falsevenildışında her şey doğru kabul edilir, işlem önceliği tablosu yoktur ve çekirdek dil değişmez, kalıcı veri yapılarını varsayılan olarak desteklerHer şey bir ifadedir; operatörlerle ifadelerin karıştığı bir yapı yoktur.
map,reduce,filteryerleşiktir ve normal kodda doğal biçimde kullanılır10 yıl önce yazılmış Clojure kodunun bugün de büyük olasılıkla çalışıyor olması beklenir; ekosistem ve dil tasarımcıları geriye dönük uyumluluğu bozmayı neredeyse tabu gibi görür
Kullandığım diller içinde fikirleri ifade etmekte en özgür hissettiren ve en az baş ağrısı yaşatan dil oldu. Fiili bir tersine debugger sayılabilecek Flowstorm da programlamada adeta bir rüya aracı
Memnun yaşamak istiyorsanız gerçekten çok iyi bir dil. Öte yandan kullanıcıların çoğu bunu doğal karşıladığı için pek gürültü koparmıyor
Clojure'u ticari olarak kullanan programcılar arasında dili çok iyi anlamadığı için pek mutlu olmayan da çok kişi var. Çoğu bunu kendisi seçmedi ya da buna henüz hazır değildi; bence Clojure'a geçmeden önce başka dillerde sevmediğiniz şeyleri yaklaşık 10 yıl yaşamış olmanız gerekiyor
Clojure'un yaratıcısı Rich Hickey'nin yazılım üzerine videoları meşhur ve etkili, ama bu iş arkadaşlarınızın onları izlemiş ya da önemsemiş olduğu anlamına gelmiyor
Büyük ölçekli, tipsiz Python kod tabanlarıyla AI kullanmak zordu. Testlerle kapsanmayan yerlerin bozulup bozulmadığını doğrulamak aşırı sıkıcıydı
Tip sistemi ne kadar güçlü olursa o kadar iyi. Ayrıca AI modelleri kod üzerinde eğitildiği için dil ne kadar popülerse performansın da o kadar iyi olma ihtimali yüksek. ClojureScript iyi ama ana akım bir dil değil; bu yüzden AI performansının JavaScript'ten düşük olacağını düşünüyorum
Sonuçta AI'ı hesaba katıyorsanız tipli bir dil seçmek ya da dinamik bir dil kullanacaksanız en azından tip ipuçları olan birini tercih etmek daha mantıklı
Bu gerçekten büyük bir gelişme. Jank duyurulduğundan beri Clojure ekosisteminde bu kadar heyecan yaratan bir şey olmamıştı
Ön yüzde JavaScript alternatiflerinin belirsiz bir nişin ötesine geçip gerçekten tutunmuş olmasını isterdim
ClojureScript gibi bir şeyi denemek istiyorum ama kişisel yan projeler dışında nerede kullanabileceğimi hayal etmek zor. Eğer arka uç zaten Clojure olan bir organizasyondaysanız benimsemek daha kolay olabilir
Üretimde kullanmadım ama birkaç yan projeyi ve aile için yaptığım bazı şeyleri dağıttım. ClojureScript'in React sarmalayıcısı olan Reagent, dürüst olmak gerekirse bana React'in kendisinden daha anlamlı geldi
Hiccup ile HTML oluşturuyorsunuz ve bileşenler Hiccup DSL'i içindeki fonksiyonlardan ibaret; bu DSL de aslında bir liste olduğu için ortaya çok temiz bir sonuç çıkıyor. Statik olan statik görünüyor, dinamik olan da açıkça dinamik görünüyor; normal React'e göre çok daha az sihir hissi veriyor
Kötü hissettiren kısım NPM'den bulunan fonksiyonel olmayan bileşenleri kullanmaya çalışırken ortaya çıkıyordu. Ölümcül değil ama kodu çirkinleştiriyor. Sarmalayıcılarla düzeltilebiliyor ama bazı JS kütüphaneleri cljs tarafında varsayılan olarak gerçekten dağınık duruyor
Topluluk da çok sıcak ve olgun
Önce kişisel betiklerinizi dönüştürüp el alışkanlığı kazanmak ve avantajlarını hissetmek iyi olur. Her durumda daha iyi değil ama sonra insanlar size danışmaya gelebilir, bu yüzden önce kendinizin ikna olması önemli
Tanıdık olmayan bir teknolojiyi içeri sokarken daha az önemli bir şeyi seçip onu yeniden yazmak ve beklemek iyi bir stratejidir. Sorun olursa geri almak kolaydır; insanlar beğenmeye başlarsa yavaş yavaş genişletirsiniz
Eskiden bir .NET organizasyonuna F#'ı gizlice sokarken de daha az kritik testleri F# ile yazarak başlamıştım
https://blisswriter.app/
https://blog.nestful.app/p/how-we-dropped-vue-for-gleam-and
cljs'i uzun süredir takip etmiyorum ama başlangıçta bunun “JavaScript üzerindeki Clojure” gibi tanıtıldığını hatırlıyorum. En azından Rich başlarda böyle anlatıyordu diye anımsıyorum
Amacın bunu olabildiğince bir başka çalışma zamanı gibi tutmak olduğunu düşünmüştüm
Ama bu değişiklik cljs'e özgü bir özellik ekliyor gibi görünüyor ve
awaitzatenclojure.coreiçinde bir anahtar sözcük olduğu için Clojure'un kendisiyle de çakışıyorİki uygulama zamanla ayrıştı mı, yoksa bu özellik kullanıcılar için o farkı kabullenecek kadar önemli miydi, merak ediyorum
Ek bir kütüphane eklemeden JavaScript birlikte çalışabilirliğini ele alabilmek açısından önemli
Uzun süredir eksik olan bir özellikti; bu yüzden bu sürüm oldukça sevindirici
async/await işlevlerini CSP ile sarmak daha iyi bir yaklaşım gibi geliyor. Clojure'da zaten daha iyi örüntüler vardı
core.async ortadan kalkmıyor; async/await, Promise tabanlı uygulamaya daha iyi uyuyorsa core.async'in
.cljstarafı da güncellenebilirBu yeni işlev ipucunun gelmesiyle o yaklaşımın ortadan kalkacağını sanmıyorum
https://clojurescript.org/guides/promise-interop#using-promi...
Buna nasıl yaklaşmam gerektiğinden emin değilim. core.async'in temel fikirlerinden biri zaten bunların hepsini kanallara taşımak değil miydi diye düşünüyorum
JavaScript tarzı
asyncanahtar sözcüğüne sahip olmanın bir yükseltme olduğundan emin değilimKullanmak zorunda değilsiniz; core.async'i kullanmaya devam edebilirsiniz. Ayrıca yakın tarihli ClojureScript anketinde en çok talep edilen özellik buydu da