Online Clojure derleyici nasıl kullanılır?
- Clojure kodunuzu editöre yazın ya da yapıştırın. Örneği sıfırla, bir faktöriyel, sıralı bir harita (map) listesi,
frequenciesve bir->>boru hattı içeren başlangıç programını geri getirir. - Çalıştır'a basın ya da Ctrl + Enter tuşlarını kullanın (Mac'te ⌘ + Enter).
printlnile yazdırılan metin Çıktı panelinde görünür. Çalıştırmadan sonra son formun değeri, okunabilirpr-strbiçiminde=> ...olarak yazdırılır. Bu değernilise, örneğin programprintlnile bitiyorsa, fazladan bir şey gösterilmez. Hatalar mesajlarıyla gösterilir.- 5, 15 veya 60 saniyelik bir süre sınırı seçin ya da bir çalıştırmayı erken bitirmek için Durdur'a basın.
İlk çalıştırmada sayfa yorumlayıcıyı indirir; boyutu yaklaşık 1 MB'tır. Kopyala ve main.cljs kodunuzu kaydeder, A−/A+ ise metin boyutunu değiştirir.
Her şey tarayıcınızdaki bir Web Worker içinde çalışır. Kodunuz hiçbir zaman bir sunucuya gönderilmez. Editör, son programınızı tarayıcınıza her derleyici için ayrı olarak otomatik kaydeder.
Clojure, ClojureScript ve SCI hakkında
Clojure, değiştirilemez (immutable) veri yapıları ve fonksiyonel programlama üzerine kurulu modern bir Lisp'tir. Özgün Clojure Java Sanal Makinesi (JVM) üzerinde çalışır; ClojureScript ise JavaScript'i hedefleyen sürümdür. Bu sayfa, tarayıcı için SCI'yi (Small Clojure Interpreter) paketleyen Scittle 0.8'i kullanır. SCI kodunuzu doğrudan ClojureScript anlambilimiyle yorumlar; JVM ya da derleme aracı gerekmez.
Neler destekleniyor?
- Tanımlar ve kontrol akışı:
def,defn,fnve#(...)sabit değerleri,let,if,when,condveloop/recur. - Kalıcı koleksiyonlar: haritalar, vektörler, kümeler ve listeler, anahtar sözcükler ile
letve fonksiyon argümanlarında yapı çözme (destructuring). - Dizi fonksiyonları:
map,filter,reduce,sort-by,group-byvefrequenciesdahil; ayrıcarangeveiterategibi tembel (lazy) diziler. - Zincirleme makroları
->ve->>; ayrıca yönetilen değiştirilebilir durum için atom'lar. - ClojureScript tarzında JavaScript birlikte çalışabilirliği; örneğin
(js/Math.sqrt 16)ya da(.toUpperCase "abc").
Sınırlamalar:
- JVM birlikte çalışabilirliği yok.
java.util.Dateya daThreadgibi sınıflar yoktur. - Leiningen ya da deps.edn yok. Harici kütüphane eklenemez; bu yüzden yalnızca editördeki kod ve yerleşik ad alanları kullanılabilir.
- Girdi kutusu yok ve DOM da yok. Test verilerinizi programın içinde tanımlayın.
Çözümlü örnek: değiştirilemezlik ve zincirleme
(def inventory {:apples 3 :pears 0})
(def restocked (assoc inventory :pears 12))
(println inventory) ; {:apples 3, :pears 0} (değişmedi)
(println restocked) ; {:apples 3, :pears 12}
(def counter (atom 0))
(dotimes [_ 5] (swap! counter inc))
(println @counter) ; 5
(->> [3 8 1 9 4]
(filter odd?)
(map #(* % 10))
(reduce +)) ; => 130
assoc yeni bir harita döndürür ve özgün haritayı değiştirmeden bırakır. Zaman içinde değişen bir değere ihtiyacınız olduğunda onu bir atom'da tutun ve swap! ile güncelleyin. Son form bir ->> boru hattıdır. Vektörü her adıma son argüman olarak geçirir ve sonucu => 130 olarak yazdırılır. Bunun yerine -> kullanın: değerin ilk argüman olması gerektiğinde, bir haritada assoc ve update ile olduğu gibi.
JVM Clojure'dan farklar ve sık yapılan hatalar
- Sayılar JavaScript sayılarıdır. ClojureScript anlambiliminde oranlar (ratio) ya da büyük tamsayılar yoktur.
(/ 1 3)0.3333333333333333döndürür ve çok büyük tamsayılar hassasiyet kaybeder. - Ayrı bir karakter türü yoktur.
\agibi bir karakter sabiti tek harfli bir metindir; bu yüzden(frequencies "mississippi")metin anahtarlarına sahiptir. - Tembellik yan etkileri gizler. Sonuç hiç kullanılmazsa
(map println xs)hiçbir şey yazdırmayabilir. Yan etkiler içindoseqya darun!kullanın. - Sonsuz diziler.
(range)veiteratehiç bitmez; bu yüzden onları her zamantakeile sınırlayın. Sonsuz bir diziyi yazdırırsanız çalıştırma, süre sınırı durdurana kadar sürer. printlnveprnfarkı.println, koleksiyonların içindeki metinleri tırnaksız yazdırır.prntırnakları korur; bu da veriyi okumayı kolaylaştırır.
Sıkça sorulan sorular
Bu gerçek Clojure mu?
Bu, JVM uygulaması değil, ClojureScript anlambilimiyle SCI tarafından çalıştırılan Clojure kodudur. Çekirdek dil, koleksiyonlar ve dizi kütüphanesi aynı şekilde çalışır; bu yüzden saf Clojure kodunun çoğu değişmeden çalışır. Java birlikte çalışabilirliği ve JVM'ye özgü davranışlar çalışmaz.
Kütüphane ekleyebilir ya da proje dosyası kullanabilir miyim?
Hayır. Leiningen, deps.edn ve Maven bağımlılıkları kullanılamaz. Her çalıştırma, editördeki tek dosyayı yorumlar.
Dosyanın adı neden main.cljs?
Çünkü kod ClojureScript anlambilimiyle çalışır. JavaScript birlikte çalışabilirliğine dayanmadığı sürece içeriği bir .clj ya da .cljc dosyasına yapıştırabilirsiniz.
Başka hangi dilleri deneyebilirim?
Online Scheme Yorumlayıcı, keşfedebileceğiniz başka bir Lisp'tir. JavaScript'in kendisi için Online JavaScript Derleyici'yi kullanın ya da tüm online derleyicilere bakın.
Güncellendi