Clojure - Clojure

Clojure
Clojure logo.svg
Paradigmaçoklu paradigma:
AileLisp
Tarafından tasarlandıZengin Hickey
İlk ortaya çıktı2007; 13 yıl önce (2007)
Kararlı sürüm
1.10.1[8] / 6 Haziran 2019; 17 ay önce (2019-06-06)
Önizleme sürümü
1.10.2-alpha1 / 5 Mart 2020; 8 ay önce (2020-03-05)
Yazma disiplini
Platform
LisansEclipse Kamu Lisansı
Dosya adı uzantıları
  • .clj
  • .cljs
  • .cljc
  • .edn
İnternet sitesitıkanma.org
Tarafından etkilenmiş
Etkilenen

Clojure (/ˈklʒər/, sevmek kapatma)[15][16] modern dinamik, ve işlevsel lehçe of Lisp programlama dili üzerinde Java platform.[17][18] Diğer Lisp lehçeleri gibi, Clojure davranır veri olarak kod ve bir Lisp makrosu sistemi.[19] Mevcut geliştirme süreci topluluk -sürmüş,[20] denetleyen Zengin Hickey onun gibi yaşam için hayırsever diktatör (BDFL).[21]

Clojure savunucuları değişmezlik ve değişmez veri yapıları ve programcıları kimliği ve durumlarını yönetme konusunda açık olmaya teşvik eder.[22] Değişmez değerler ve zamanın açık ilerlemesi yapılarıyla programlamaya bu odaklanma, özellikle daha sağlam geliştirmeyi kolaylaştırmayı amaçlamaktadır. eşzamanlı, basit ve hızlı programlar.[23][24][15] Tip sistemi tamamen dinamik, son çabalar da kademeli yazma.[25]

Clojure için ticari destek, Cognitect tarafından sağlanır.[26] Clojure konferansları her yıl dünya çapında organize edilmektedir, bunların en ünlüsü Clojure / conj.[27]

Tarih ve gelişim süreci

Zengin Hickey, Clojure'ün yaratıcısı

Rich Hickey, Clojure dilinin yaratıcısıdır.[17] Clojure'den önce, benzer bir proje olan dotLisp'i geliştirdi. .AĞ platform[28] ve Lisp ile birlikte çalışabilirlik sağlamaya yönelik önceki üç girişim Java: a Java yabancı dil arayüzü Ortak Lisp (jfli),[29] Bir Lisp için Yabancı Nesne Arayüzü (FOLYO),[30] ve bir Java Servletleri için Lisp dostu arayüz (Lisplets).[31]

Hickey, halka açık bir şekilde yayınlamadan önce Clojure üzerinde yaklaşık 2½ yıl çalışarak geçirdi, o zamanın çoğunda dış finansman olmadan yalnızca Clojure üzerinde çalıştı. Bu sürenin sonunda Hickey, Common Lisp topluluğundaki bazı arkadaşlarına dili duyuran bir e-posta gönderdi.

Geliştirme süreci topluluk odaklıdır[20] ve Clojure'da yönetiliyor JIRA proje sayfası.[32] Clojure Google Grubu'nda genel geliştirme tartışması yapılır.[33] Ask.clojure.org adresinden herkes sorunları ve fikirleri gönderebilir,[34] ancak yamalara katkıda bulunmak için Clojure Contributor sözleşmesini imzalamanız gerekir.[35] JIRA sorunları bir tarama ekibi tarafından işlenir ve sonunda Rich Hickey değişiklikleri onaylar.[36]

Clojure'un adı, Hickey'e göre, cinas programlama konsepti üzerine "kapatma "için C, L ve J harflerini içeren C #, Lisp, ve Java sırasıyla - Clojure'un tasarımında önemli bir etkiye sahip olan üç dil.[37]

Tasarım felsefesi

Rich Hickey Clojure'u geliştirdi çünkü modern bir Lisp için fonksiyonel programlama yerleşik ile simbiyotik Java platform ve için tasarlandı eşzamanlılık.[23][24][38][15]

Clojure'un yaklaşımı durum kimlikler kavramı ile karakterizedir,[22] zaman içinde bir dizi değişmez durum olarak temsil edilen. Eyaletler değişmez değerler olduğu için, herhangi bir sayıda işçi bunlar üzerinde paralel olarak çalışabilir ve eşzamanlılık, bir durumdan diğerine değişiklikleri yönetme meselesi haline gelir. Bu amaçla, Clojure birkaç değiştirilebilir referans türleri, her biri durumlar arası geçiş için iyi tanımlanmış anlamlara sahiptir.[22]

Dile genel bakış

SürümYayın tarihiBaşlıca özellikler / iyileştirmeler
16 Ekim 2007[39]İlk genel yayın
1.04 Mayıs 2009[40]İlk kararlı sürüm
1.131 Aralık 2009[41]Vadeli işlemler
1.219 Ağustos 2010[42]Protokoller
1.323 Eylül 2011[43]Gelişmiş ilkel destek
1.4Nisan 15, 2012[44]Okuyucu değişmez değerleri
1.51 Mart 2013[45]Redüktörler
1.5.110 Mart 2013[46]Bellek sızıntısını düzeltme
1.6Mart 25, 2014[47]Java API, gelişmiş karma algoritmalar
1.730 Haziran 2015[48]Dönüştürücüler, okuyucu koşullu
1.8Ocak 19, 2016[49]Ek dizi işlevleri, doğrudan bağlantı, soket sunucusu
1.9Aralık 8, 2017[50]Teknik özellik, komut satırı araçlarıyla entegrasyon
1.10Aralık 17, 2018[51]İyileştirilmiş hata raporlama, Java uyumluluğu
Mevcut kararlı sürüm: 1.10.16 Haziran 2019[8]Bir Java performans gerilemesi etrafında çalışmak ve clojure.main'den hata raporlamasını iyileştirmek
Açıklama:
Eski versiyon
Eski sürüm, hala korunuyor
En son sürüm
En son önizleme sürümü
Gelecek sürüm

Clojure, Java platform ve sonuç olarak entegre olur Java ve Clojure'dan Java kodunu çağırmayı tam olarak destekler,[52][15] Clojure kodu Java'dan da çağrılabilir.[53] Topluluk kullanır Leiningen proje otomasyonu için, Uzman entegrasyon. Leiningen, proje paketi yönetimi ve bağımlılıklarını yönetir ve Clojure sözdizimi kullanılarak yapılandırılır.[54]

Diğer Lisp'lerin çoğu gibi, Clojure'un sözdizimi, S ifadeleri bunlar derlenmeden önce bir okuyucu tarafından veri yapılarına ayrıştırılır.[55][15] Clojure's okuyucu için değişmez sözdizimini destekler haritalar, ayarlar ve vektörler listelere ek olarak, bunlar doğrudan belirtilen yapılara derlenir.[55] Clojure bir Lisp-1 ve diğer Lisp'lerle uyumlu olmayan kendi veri yapılarını kullandığından, Lisp'in diğer lehçeleriyle kod uyumlu olması amaçlanmamıştır.[19]

Bir Lisp lehçesi olarak Clojure, fonksiyonlar gibi birinci sınıf nesneler, bir okuma-değerlendirme-yazdırma döngüsü (REPL) ve bir makro sistem.[6] Clojure's Lisp makrosu sistem şuna çok benzer: Ortak Lisp Clojure'un sürümünün geri alıntı ("sözdizimi alıntı" olarak adlandırılır), sembolleri kendi ad alanı. Bu, ad alanı nitelikli adlara bağlanmak yasak olduğundan, istenmeyen ad yakalamayı önlemeye yardımcı olur. Yakalayan bir makro genişletmeyi zorlamak mümkündür, ancak bu açıkça yapılmalıdır. Clojure, kullanıcı tanımlı okuyucu makrolarına izin vermez, ancak okuyucu daha kısıtlı bir sözdizimsel uzantı biçimini destekler.[56] Clojure destekler çoklu yöntemler[57] ve için arayüz benzeri soyutlamalarda protokol[58] tabanlı polimorfizm ve veri türü sistemi kullanarak kayıtları,[59] önlemek için tasarlanmış yüksek performanslı ve dinamik polimorfizm sağlayan ifade problemi.

Clojure aşağıdakileri destekler: tembel diziler ve ilkesini teşvik eder değişmezlik ve kalıcı veri yapıları. Olarak Fonksiyonel dil vurgulanır özyineleme ve üst düzey işlevler yan etkiye dayalı döngü yerine. Otomatik kuyruk çağrısı JVM bunu yerel olarak desteklemediğinden optimizasyon desteklenmez;[60][61][62] bunu açıkça kullanarak yapmak mümkündür tekrar etmek anahtar kelime.[63] İçin paralel ve eşzamanlı Clojure programlama sağlar yazılım işlem belleği,[64] reaktif ajan sistemi,[1] ve kanal tabanlı eşzamanlı programlama.[65]

Clojure 1.7, Clojure ve ClojureScript kodunun aynı ad alanına gömülmesine izin vererek okuyucu koşullarını tanıttı.[48][55] Dönüştürücüler, dönüşümleri oluşturmak için bir yöntem olarak eklendi. Transdüserler, aşağıdaki gibi daha yüksek seviyeli işlevleri etkinleştirir: harita ve kat herhangi bir girdi verisi kaynağı üzerinde genelleme yapmak. Geleneksel olarak bu işlevler, diziler dönüştürücüler, kanallar üzerinde çalışmasına ve kullanıcının kendi transdüksiyon modellerini tanımlamasına izin verir.[66][67][68]

Alternatif Platformlar

Clojure'un birincil platformu Java,[18][52] ancak başka hedef uygulamalar mevcuttur. Bunlardan en önemlisi ClojureScript,[69] hangi derleme ECMAScript 3,[70] ve ClojureCLR,[71] tam bir liman .AĞ platformu, ekosistemiyle birlikte çalışabilir. Clojure topluluğunda 1.060 katılımcıyla 2013 yılında yapılan bir anket[72] yanıt verenlerin% 47'sinin Clojure ile çalışırken hem Clojure hem de ClojureScript kullandığını bulmuştur. 2014 yılında bu sayı% 55'e yükseldi,[73] 2015'te 2.445 katılımcıya göre% 66'ya ulaştı.[74] Popüler ClojureScript projeleri, Tepki Reaktif gibi kitaplık,[75] yeniden çerçeve[76] ROM,[77] ve Om.[78][79]

Diğer Uygulamalar

Clojure'un farklı platformlardaki diğer uygulamaları şunları içerir:

  • CljPerl,[80] Üstte Clojure Perl
  • Clojerl,[81] Clojure üzerinde KİRİŞ, Erlang sanal makine
  • Clojure-py,[82] Saf Clojure Python
  • Gelincik[83] mikro denetleyicilerde çalışabilen kendi kendine yeten C ++ 11'e derler
  • Joker,[84] bir tercüman ve linter yazılmış Git
  • Las3r,[85] bir Clojure alt kümesi ActionScript Sanal Makine (Adobe Flash Player platformu)
  • Pixie,[86] Clojure'den esinlenen Lisp lehçesi ile yazılmış RPython
  • Rouge,[87] YARV üzerindeki Clojure in Yakut

Popülerlik

Fonksiyonel programlamaya olan ilginin devam etmesi ile Clojure'un Java platformunu kullanan yazılım geliştiricileri tarafından benimsenmesi artmaya devam etti. Dil, Brian Goetz gibi yazılım geliştiricileri tarafından da önerilmiştir,[88][89][90] Eric Evans,[91][92] James Gosling,[93] Paul Graham,[94] ve Robert C. Martin.[95][96][97][98] Düşünce işleri, Teknoloji Radarı için işlevsel programlama dillerini değerlendirirken,[99] Clojure'u 2010'da "Lisp'in JVM'de basit ve zarif bir uygulaması" olarak tanımladı ve 2012'de statüsünü "ADOPT" olarak yükseltti.[100]

Snyk ve Java Magazine tarafından ortaklaşa hazırlanan "JVM Ecosystem Report 2018" ("Java geliştiricilerinin şimdiye kadarki en büyük anketi" olduğu iddia edildi) 'de Clojure, JVM'de en çok kullanılan 2. programlama dili seçildi " ana uygulamalar ".[101] Clojure, endüstride firmalar tarafından kullanılmaktadır.[102] gibi elma,[103][104] Atlassiyen,[105] Finansman Çemberi,[106] Netflix,[107] Kukla,[108] ve Walmart[109] gibi devlet kurumlarının yanı sıra NASA.[110] Ayrıca görsel sanat, müzik, oyunlar ve şiir dahil olmak üzere yaratıcı bilgi işlem için de kullanılmıştır.[111]

Araçlar

Clojure geliştirme araçları, yıllar içinde önemli gelişmeler kaydetti. Aşağıdakilerden bazı popüler IDE'ler ve metin editörleri Clojure geliştirmeyi destekleyen eklentilerle:[112]

Topluluk tarafından sağlanan araçlara ek olarak, resmi Clojure CLI araçlar[123] ayrıca mevcut hale geldi GNU / Linux, Mac os işletim sistemi, ve pencereler Clojure 1.9'dan beri.[124]

Örneğe göre özellikler

Aşağıdaki örnekler, Clojure CLI araçlarıyla başlatılanlar gibi bir Clojure REPL'de çalıştırılabilir.[123] veya REPL.it'de bulunan gibi çevrimiçi bir REPL.[125]

Basitlik

Basitliğe yapılan güçlü vurgu nedeniyle, tipik Clojure programları çoğunlukla işlevlerden ve basit veri yapılarından (yani listeler, vektörler, haritalar ve kümeler) oluşur:

;; Clojure programının tipik bir giriş noktası:;; `-main` işlevi(tanım -ana ; isim  [& argümanlar] ; (değişken) parametreler  (println "Selam Dünya!")) ; vücut

REPL'de programlama

Diğerleri gibi Lisps Clojure'un ikonik özelliklerinden biri, REPL.[126] Aşağıdaki örneklerde, ;; bir satır yorumu başlatır ve ;; => beklenen çıktıyı gösterir:

;; bir var tanımlamak(def a 42);; => # 'kullanıcı / a;; "+" adlı bir işlevi çağırın(+ a 8);; => 50;; "çift" adlı bir işlevi çağırın(hatta? a);; => doğru;; 10'a bölündüğünde "n" nin kalanını döndüren bir işlev tanımlayın(tanım foo [n] (rem n 10));; => # 'kullanıcı / foo;; işlevi çağır(foo a);; => 2;; "rem" dizgesini yazdır(belge rem);; =>-------------------------clojure.core / rem([num div]) kalan nın-nin bölme pay tarafından payda.;; "rem" kaynağını yazdır(kaynak rem);; =>(tanım rem  "Payın paydaya bölünmesinin kalanı."  {:katma "1.0"   :statik doğru   :Çizgide (fn [x y] `(. clojure.lang.Numbers (kalan ~x ~y)))}  [num div]    (. clojure.lang.Numbers (kalan num div)))

Çalışma zamanında isimler

Adların derlendiği diğer çalışma zamanı ortamlarının aksine, Clojure'un çalışma zamanı ortamı, normal Clojure veri yapıları kullanılarak kolayca iç gözlemlenebilir:

;; bir var tanımlamak(def a 42);; => # 'kullanıcı / a;; "user" ad alanında bulunan tüm genel değişkenlerin bir haritasını alın(ns-publics 'kullanıcı);; => {a # 'kullanıcı / a};; varlığa `` # '' (okuyucu makrosu) aracılığıyla başvur ve;; ilişkili, ad alanı nitelikli sembolü "kullanıcı / a"#'kullanıcı / a;; => # 'kullanıcı / a;; de-referansı (değerini al) var(deref #'kullanıcı / a);; => 42;; bir işlev tanımlayın (bir docstring ile);; 10'a bölündüğünde "n" nin kalanını döndürür(tanım foo "şunu döndürür` (rem n 10) `" [n] (rem n 10));; => # 'kullanıcı / foo;; var "# 'user / foo` meta verilerini al(meta #'kullanıcı / foo);; =>{: arglists ([n]), : doc "şunu döndürür` (rem n 10) `", :hat 1, : sütun 1, :dosya "user.clj", : isim foo, : ns #ad alanı[kullanıcı]}

Veri olarak kod (homoconicity)

Diğerine benzer Lisps Clojure homoikonik (Ayrıca şöyle bilinir veri olarak kod ). Aşağıdaki örnekte, kodun kendisini değiştiren bir kod yazmanın ne kadar kolay olduğunu görebiliriz:

;; bir işlevi çağırın (kod)(+ 1 1);; => 2;; fonksiyon çağrısı alıntı;; (kodu, sembollerin bir listesi olan verilere dönüştürmek)(alıntı (+ 1 1));; => (+ 1 1);; listedeki ilk öğeyi al;; (kod üzerinde veri olarak çalışır)(ilk (alıntı (+ 1 1)));; => +;; listedeki son öğeyi al;; (kod üzerinde veri olarak çalışır)(son (alıntı (+ 1 1)));; => 1;; orijinal listedeki sembolleri değiştirerek yeni bir liste alın;; (kodu veri olarak değiştirme)(harita (fn [form]       (durum form         1 'bir         + 'artı))     (alıntı (+ 1 1)));; => (artı bir)

Veri dönüşümü için etkileyici operatörler

İş parçacığı makroları (->, ->>ve arkadaşlar), bir veri koleksiyonunu bir dizi dönüşüm yoluyla aktarmanın soyutlamasını sözdizimsel olarak ifade edebilir:

(->> (Aralık 10)     (harita inc)     (filtre hatta?));; => (2 4 6 8 10)

Bu aynı zamanda dönüştürücüler kullanılarak daha verimli bir şekilde elde edilebilir:

(sıra (comp (harita inc)                (filtre hatta?))          (Aralık 10));; => (2 4 6 8 10)

Kimlik ve durumun iş parçacığı güvenli yönetimi

Bir iş parçacığı güvenli benzersiz seri numaralarının üreteci (yine de, diğer birçok Lisp lehçesi gibi, Clojure'un yerleşik bir jimnastik dahili olarak kullandığı işlev):

(def ben (atom 0))(tanım benzersiz-kimlik oluştur  "Her çağrı için farklı bir sayısal kimlik döndürür."  []  (takas! ben inc))

Makrolar

Anonim bir alt sınıfı java.io.Writer hiçbir şeye yazmayan ve içindeki tüm baskıları susturmak için onu kullanan bir makro:

(def bit kovası yazar  (vekil [java.io.Writer] []    (yazmak [buf] sıfır)    (kapat []    sıfır)    (kızarma []    sıfır)))(defmacro noprint  "Verilen" formları ", tüm yazdırma" * dışarıda * "susturulmuş olarak değerlendirir."  [& formlar]  `(bağlayıcı [*dışarı* bit kovası yazar]     ~@formlar))(noprint  (println "Merhaba kimse!"));; => sıfır

Java ile dil birlikte çalışabilirliği

Clojure, tasarım hedeflerinden biri olarak ana platformlarını benimsemek için sıfırdan oluşturuldu ve bu nedenle mükemmel dil birlikte çalışabilirliği Java ile:

;; bir örnek yöntemi çağır(.toUpperCase "elma");; => "ELMA";; statik bir yöntem çağırmak(Sistem / getProperty "java.vm.version");; => "12+33";; bir "java.util.HashMap" örneği oluşturun ve;; bazı girişler ekle(yapmak (java.util.HashMap.)  (.koymak "elma" 1)  (.koymak "muz" 2));; => {"muz" 2, "elma" 1};; bir "java.util.ArrayList" örneği oluşturun ve;; öğelerini "clojure.core / map" ile artırın(def al (yapmak (java.util.ArrayList.)          (.Ekle 1)          (.Ekle 2)          (.Ekle 3)))(harita inc al);; => (2 3 4);; Java Swing kullanarak bir mesaj diyaloğu göster(javax.swing.JOptionPane / showMessageDialog  sıfır  "Selam Dünya!");; => sıfır

Yazılım işlem belleği

Her biri 10 (başlangıçta sıralı) benzersiz sayı içeren 100 vektörden oluşan bir paylaşılan veri yapısını işleyen 10 iş parçacığı. Her iş parçacığı daha sonra art arda iki rastgele vektörde iki rastgele konum seçer ve bunları değiştirir. Vektörlerde yapılan tüm değişiklikler işlemlerde Clojure'un kullanımıyla gerçekleşir. yazılım işlem belleği sistem:

(tanım koşmak  [nvecs Nitemler nthreads niterler]  (İzin Vermek [vec-refs        (->> (* nvecs Nitemler)             (Aralık)             (içine [] (comp (tüm bölüm Nitemler)                            (harita vec)                            (harita ref))))        takas        #(İzin Vermek [v1 (rand-int nvecs)               v2 (rand-int nvecs)               i1 (rand-int Nitemler)               i2 (rand-int Nitemler)]          (Dosync            (İzin Vermek [tmp (n. @(vec-refs v1) i1)]              (değiştirmek (vec-refs v1) doç i1 (n. @(vec-refs v2) i2))              (değiştirmek (vec-refs v2) doç i2 tmp))))        bildiri        #(->> vec-refs              (içine [] (comp (harita deref)                             (harita (fn [v] (prn v) v))                             kedi                             (farklı)))              (Miktar)              (println "Farklı:"))]    (bildiri)    (->> #(nokta zamanları [_ niterler] (takas))         (tekrar et nthreads)         (uygulamak pcalls)         (Dorun))    (bildiri)))(koşmak 100 10 10 100000);; =>[0 1 2 3 4 5 6 7 8 9][10 11 12 13 14 15 16 17 18 19]  ...[990 991 992 993 994 995 996 997 998 999]Farklı: 1000[382 318 466 963 619 22 21 273 45 596][808 639 804 471 394 904 952 75 289 778]  ...[484 216 622 139 651 592 379 228 242 355]Farklı: 1000sıfır

Ayrıca bakınız

Referanslar

  1. ^ a b "Aracılar ve Eşzamansız İşlemler". Clojure.org. Alındı 2019-07-07.
  2. ^ "Eşzamanlı Programlama". Clojure.org. Alındı 2019-07-07.
  3. ^ Hickey, Rich; katkıda bulunanlar. "core.async". GitHub.com. Alındı 2019-07-07.
  4. ^ "Fonksiyonel Programlama". Clojure.org. Alındı 2019-07-07.
  5. ^ Nolen, David; Hickey, Rich; katkıda bulunanlar. "core.logic". GitHub.com. Alındı 2019-07-07.
  6. ^ a b "Makrolar". Clojure.org. Alındı 2019-07-07.
  7. ^ Esterhazy, Paulus. "Diş Açma Makroları Kılavuzu". Clojure.org. Alındı 2019-07-07.
  8. ^ a b Miller, Alex (2019-06-06). "Clojure 1.10.1 sürümü". Clojure.org.
  9. ^ Fogus, Michael (2011). "Rich Hickey Soru-Cevap". CodeQuarterly.com. Arşivlenen orijinal 2017-01-11 tarihinde.
  10. ^ Hickey, Rich. "Clojure Kitaplık". Amazon.com. Arşivlenen orijinal 2017-10-03 tarihinde. Alındı 2019-07-07.
  11. ^ Bonnaire-Çavuş, Ambrose (2012). Clojure için Pratik Opsiyonel Tip Sistem (Tez). Batı Avustralya Üniversitesi.
  12. ^ "Clojure Programlama" (PDF). OReilly.com. Alındı 2013-04-30.
  13. ^ Baldridge, Timothy. "Pixie". PixieLang.org. Alındı 2019-07-07.
  14. ^ Ramachandra, Ramkumar. "Ren". GitHub.org. Alındı 2019-07-07.
  15. ^ a b c d e Edwards, Kathryn (2009-08-10). "Programlama Dillerinin A-Z'si: Clojure". Computerworld.com.au.
  16. ^ Hickey, Zengin (2009/01/05). "Clojure'ün anlamı ve telaffuzu". Google.com.
  17. ^ a b Krill, Paul (2012-03-22). "Clojure mucidi Hickey artık Android'i hedefliyor". InfoWorld.com.
  18. ^ a b "Clojure". Clojure.org. Alındı 2019-07-07.
  19. ^ a b "Diğer Lisp'lerle Farklar". Clojure.org. Alındı 2019-07-07.
  20. ^ a b "Geliştirme". Clojure.org. Alındı 2019-07-07.
  21. ^ Hickey, Zengin (2018-11-26). "Açık Kaynak Sizinle İlgili Değil". GitHub.com.
  22. ^ a b c "Değerler ve Değişim: Clojure'un Kimlik ve Devlet yaklaşımı". Clojure.org. Alındı 2019-07-07.
  23. ^ a b Hickey, Rich. "Gerekçe". Clojure.org. Alındı 2019-07-07.
  24. ^ a b Torre, Charles (2009-10-06). "Uzmandan Uzmana: Zengin Hickey ve Brian Beckman - Inside Clojure". MSDN.com.
  25. ^ "core.typed". GitHub.com. Alındı 2019-07-07.
  26. ^ "Daha İyi Bir Yolda Yatırım Yapmak". Cognitect.com. Alındı 2019-07-07.
  27. ^ "Clojure / con". Clojure-Conj.org. Alındı 2019-07-07.
  28. ^ Hickey, Rich (2002-10-16). "[ANN] dotLisp - .Net için bir Lisp lehçesi". Google.com.
  29. ^ Hickey, Zengin (2013/04/15). "jfli". SourceForge.net.
  30. ^ Hickey, Zengin (2013/04/03). "folyo - Lisp için Yabancı Nesne Arayüzü". SourceForge.net.
  31. ^ Hickey, Zengin (2013-03-07). "Lisplets". SourceForge.net.
  32. ^ "Clojure". Atlassian.net. Alındı 2019-07-07.
  33. ^ "Clojure". Google.com. Alındı 2019-07-07.
  34. ^ "Clojure Forumu". clojure.org. Alındı 2020-03-20.
  35. ^ "Katılımcı Sözleşmesi". Clojure.org. Alındı 2019-07-07.
  36. ^ "İş Akışı". Clojure.org. Alındı 2019-07-07.
  37. ^ Zengin, Hickey (2009/01/05). "Clojure Posta Listesi: Clojure'ün anlamı ve telaffuzu". groups.google.com. Arşivlendi 2020-01-09 tarihinde orjinalinden. Alındı 2020-01-09.
  38. ^ Elmendorf, Dirk (2010-04-01). "Economy Size Geek - Clojure'un Yaratıcısı Rich Hickey ile Röportaj". LinuxJournal.com.
  39. ^ Hickey, Zengin (2007-10-16). "Clojure İki!". BlogSpot.com.
  40. ^ Hickey, Zengin (2009-05-04). "Clojure 1.0". BlogSpot.com.
  41. ^ Hickey, Zengin (2009-12-31). "Clojure 1.1 Sürümü". BlogSpot.com.
  42. ^ Hickey, Rich (2010-08-19). "Clojure 1.2 Sürümü". Google.com.
  43. ^ Redinger, Christopher (2011-09-23). "[ANN] Clojure 1.3 Yayınlandı". Google.com.
  44. ^ Dipert, Alan (2012-04-17). "[ANN] Clojure 1.4 Yayınlandı". Google.com.
  45. ^ Halloway Stuart (2013-03-01). "YSA: Clojure 1.5". Google.com.
  46. ^ Halloway, Stuart (2013-03-10). "Clojure 1.5.1". Google.com.
  47. ^ Miller, Alex (2014-03-25). "[ANN] Clojure 1.6". Google.com.
  48. ^ a b Miller, Alex (2015-06-30). "Clojure 1.7 artık kullanılabilir". Clojure.org.
  49. ^ Miller, Alex (2016-01-19). "Clojure 1.8 artık kullanılabilir". Clojure.org.
  50. ^ Miller, Alex (2017-12-08). "Clojure 1.9 artık kullanılabilir". Clojure.org.
  51. ^ Miller, Alex (2018-12-17). "Clojure 1.10 sürümü". Clojure.org.
  52. ^ a b "JVM'de Barındırılıyor". Clojure.org. Alındı 2019-07-07.
  53. ^ "Java Interop". Clojure.org. Alındı 2019-07-07.
  54. ^ Hagelberg, Phil; katkıda bulunanlar. "Leiningen". Leiningen.org. Alındı 2019-07-07.
  55. ^ a b c "Okuyucu". Clojure.org. Alındı 2019-07-07.
  56. ^ Hickey, Rich. "edn". GitHub.com. Alındı 2019-07-07.
  57. ^ "Çoklu yöntemler ve Hiyerarşiler". Clojure.org. Alındı 2019-07-07.
  58. ^ "Protokoller". Clojure.org. Alındı 2019-07-07.
  59. ^ "Veri türleri: yeniden yazın, yeniden kaydedin ve yeniden belirtin". Clojure.org. Alındı 2019-07-07.
  60. ^ Goetz, Brian (2014-11-20). "Yönetim: Ayık Parçalar". YouTube.com.
  61. ^ Gül, John (2007-07-12). "sanal makinedeki çağrıları kuyrukla". Oracle.com.
  62. ^ Gül, John (2009-02-11). "Bazı dillerin kuyruk aramaları yapabilmesi gerekir". Java.net.
  63. ^ "Özel Formlar". Clojure.org. Alındı 2019-07-07.
  64. ^ "Referanslar ve İşlemler". Clojure.org. Alındı 2019-07-07.
  65. ^ Hickey, Zengin (2013-06-28). "Clojure core.async Kanalları". Clojure.org.
  66. ^ Hickey, Zengin (2014-09-17). "Dönüştürücüler". YouTube.com.
  67. ^ Hickey, Rich (2014-08-06). "Dönüştürücüler Geliyor". Cognitect.com.
  68. ^ Hickey, Zengin (2014-11-20). "İç Dönüştürücüler". YouTube.com.
  69. ^ "ClojureScript". ClojureScript.org. Alındı 2019-07-06.
  70. ^ "ClojureScript - SSS (JavaScript geliştiricileri için)". ClojureScript.org. Alındı 2018-02-04.
  71. ^ "ClojureCLR". GitHub.com. Alındı 2012-06-28.
  72. ^ Emerick, Chas (2013-11-18). "2013 Clojure Durumu ve ClojureScript anketinin sonuçları". CEmerick.com.
  73. ^ "State of Clojure 2014 Anketi Sonuçları". WuFoo.com. Alındı 2015-09-17.
  74. ^ Gehtland, Justin (2016/01/28). "State of Clojure 2015 Anketi Sonuçları". Cognitect.com.
  75. ^ "Reaktif". GitHub.io. Alındı 2019-07-06.
  76. ^ "yeniden çerçeve". GitHub.com. Alındı 2019-07-06.
  77. ^ Prokopov, Nikita. "ROM". GitHub.com. Alındı 2019-07-06.
  78. ^ Nolen, David. "Om". GitHub.com. Alındı 2019-07-06.
  79. ^ Coupland, Tom (2014/01/17). "Om: Facebook'un Değişmezlik ile Tepkisini Güçlendirme". InfoQ.com.
  80. ^ Hu, Wei. "Perl'de Bir Lisp". MetaCPAN.org. Alındı 2019-07-06.
  81. ^ Facorro, Juan. "Clojerl". GitHub.com. Alındı 2019-07-06.
  82. ^ Baldridge, Timothy. "clojure-py". GitHub.com. Alındı 2019-07-06.
  83. ^ Akkaya, Nurullah. "Gelincik". Ferret-Lang.org. Alındı 2019-07-06.
  84. ^ Bataev, Roman. "Joker". Joker-Lang.org. Alındı 2019-07-06.
  85. ^ Top, Aemon. "Laz3r". GitHub.com. Alındı 2019-07-06.
  86. ^ Baldridge, Timothy. "Pixie". PixieLang.org. Alındı 2019-07-06.
  87. ^ Connor, Ashe. "Rouge". GitHub.com. Alındı 2019-07-06.
  88. ^ Goetz, Brian (2020-05-24). "Brian Goetz'in favori Java dışı JVM dili (Bölüm 1/3)". Twitch.tv.
  89. ^ Goetz, Brian (2020-05-24). "Brian Goetz'in favori Java dışı JVM dili (Bölüm 2/3)". Twitch.tv.
  90. ^ Goetz, Brian (2020-05-24). "Brian Goetz'in favori Java dışı JVM dili (Bölüm 3/3)". Twitch.tv.
  91. ^ Evans, Eric (2018/08/14). "Modelleme Zamanı - Eric Evans - Etki Alanına Dayalı Tasarım Avrupa 2018". YouTube.com.
  92. ^ Evans, Eric (2014-11-21). "Eric Evans Twitter'da". Twitter.com.
  93. ^ "James Gostling'in Londra Java Topluluğu ile buluşması". YouTube.com. 2016-10-11.
  94. ^ Graham, Paul (2016-05-06). "Paul Graham Twitter'da". Twitter.com.
  95. ^ Martin, Robert (2019-08-22). "Neden Clojure?". CleanCoder.com.
  96. ^ Martin, Robert (2018-11-29). "Twitter'da Bob Martin'i Kaldır". Twitter.com.
  97. ^ Martin, Robert (2018/08/01). "Fonksiyonel Programlamaya Giriş". CleanCoders.com.
  98. ^ Martin, Robert (2017-07-11). "Pragmatik Fonksiyonel Programlama". CleanCoder.com.
  99. ^ "Sık Sorulan Sorular - Teknoloji Radarı - ThoughtWorks". ThoughtWorks.com. Alındı 2019-02-10.
  100. ^ "Clojure - Teknoloji Radarı - ThoughtWorks". ThoughtWorks.com. Alındı 2019-02-10.
  101. ^ Maple, Simon; Binstock, Andrew (2018-10-17). "JVM Ekosistem Raporu 2018". Snyk.io.
  102. ^ "Başarı Öyküleri". Clojure.org. Alındı 2018-10-27.
  103. ^ Liutikov, Roman (2017-12-17). "Roman Liutikov Twitter'da". Twitter.com.
  104. ^ "Apple'da İşler". Apple.com. Alındı 2019-07-06.
  105. ^ Borges, Leonardo (2015-07-07). "Clojure ile Gerçek Zamanlı İşbirliği". YouTube.com.
  106. ^ Pither, Jon (2016-10-04). "Londra'da Clojure: Finans Çemberi - Biraz Clojure Ödünç Verme". JUXT.pro.
  107. ^ Williams, Alex (2014-08-03). "Yeni Yığın Oluşturucular: Sun, Netflix, Clojure, Go, Docker ve Daha Fazlasında Adrian Cockcroft". TheNewStack.io.
  108. ^ Fiyat, Chris (2014-04-11). "Puppet Labs'de Yeni Bir Uygulama Hizmetleri Çağı". Puppet.com. Alındı 2020-08-06.
  109. ^ Phillips, Marc (2015-07-14). "Walmart Clojure'u Ölçekte Çalıştırır". Cognitect.com.
  110. ^ "Ortak Meta Veri Havuzu". GitHub.com. Alındı 2019-07-06.
  111. ^ Meier, Carin (2015-05-06). "Clojure ile yaratıcı bilgi işlem". OReilly.com.
  112. ^ Miller, Alex (2019-02-04). ""Clojure Durumu 2019 "Sonuçlar". Clojure.org.
  113. ^ Szabo, Maurício. "Klor: Clojure ve ClojureScript için Soket REPL İstemcisi". Atom.io. Alındı 2019-07-05.
  114. ^ Batsov, Bozhidar; katkıda bulunanlar. "CIDER: Sarsan Clojure Etkileşimli Geliştirme Ortamı". CIDER.mx. Alındı 2019-07-05.
  115. ^ Shrago, Greg. "Clojure-Kit: IntelliJ tabanlı araçlar için Clojure ve ClojureScript eklentisi". JetBrains.com. Alındı 2019-07-05.
  116. ^ Fleming, Colin. "El yazısı: Tam Clojure ve ClojureScript dil desteği sağlar". JetBrains.com. Alındı 2019-07-05.
  117. ^ Pope, Tim. "şömine.vim: Clojure REPL Desteği". VIM.org. Alındı 2019-07-05.
  118. ^ Monroe, Dominic (2016-12-13). "Clojure and Vim: Genel bir bakış - Bu çok mümkün". JUXT.pro.
  119. ^ Masashi, Iizuka. "vim-iced: Vim8 / Neovim için Clojure Etkileşimli Geliştirme Ortamı". GitHub.com. Alındı 2020-03-13.
  120. ^ Caldwell, Oliver. "Prepl üzerinden Neovim Clojure (Script) aracı". GitHub.com. Alındı 2019-11-09.
  121. ^ Caldwell, Oliver (2019-11-06). "Clojure, Neovim ve Conjure'e dakikalar içinde başlarken". oli.me.uk.
  122. ^ Strömberg, Peter. "Calva: Clojure & ClojureScript Etkileşimli Programlama". VisualStudio.com. Alındı 2019-07-05.
  123. ^ a b Miller, Alex. "Deps ve CLI Kılavuzu". Clojure.org. Alındı 2019-07-08.
  124. ^ Miller, Alex (2017-12-08). "Clojure 1.9". Cognitect.com.
  125. ^ "Çevrimiçi Clojure REPL". REPL.it. Alındı 2019-07-08.
  126. ^ "REPL'de Programlama: Giriş". Clojure.org. Alındı 2018-12-04.

daha fazla okuma

Dış bağlantılar

Resmi internet sitesi Bunu Vikiveri'de düzenleyin