Clojure
![]() | |
Paradigma | Multi-Paradigma: |
---|---|
Familie | Lispeln |
Entworfen von | Reicher Hickey |
Erstmals erschienen | 2007 |
Stabile Version | 1.11.1[8] / 5. April 2022 |
Disziplin tippen | |
Plattform | |
Lizenz | Eclipse Public Lizenz |
Dateiname -Erweiterungen |
|
Webseite | Clojure |
Beeinflusst von | |
Beeinflusst | |
|
Clojure (/ˈkloʊʒər/, wie Schließung)[15][16] ist ein dynamisch und funktional Dialekt des Lisp -Programmiersprache auf der Java Plattform.[17][18] Clojure behandelt wie andere Lisp -Dialekte Code als Daten und hat a Lisp -Makro System.[19] Der aktuelle Entwicklungsprozess ist Gemeinschaft-Gefahren,[20] überwacht von Reicher Hickey wie es Wohlwollender Diktator für das Leben (BDFL).[21]
Clojure -Befürworter Unveränderlichkeit und Unveränderliche Datenstrukturen und ermutigt Programmierer, sich ausdrücklich mit der Verwaltung der Identität und ihren Staaten umzusetzen.[22] Diese Fokussierung auf die Programmierung mit unveränderlichen Werten und explizit gleichzeitig, Programme, die einfach und schnell sind.[23][24][15] Während sein Typsystem völlig ist dynamischDie jüngsten Bemühungen haben auch die Umsetzung von a beantragt Abhängiger Typsystem.[25]
Geschichte und Entwicklungsprozess

Reicher Hickey ist der Schöpfer der Clojure -Sprache.[17] Vor Clojure entwickelte er Dotlisp, ein ähnliches Projekt basierend auf dem .NETZ Plattform,[26] und drei frühere Versuche, Interoperabilität zwischen Lisp und zu bieten Java: a Java Fremdsprachschnittstelle für Common Lisp (JFLI),[27] A Fremdobjektschnittstelle für Lisp (VEREITELN),[28] und ein Lisp-freundliche Schnittstelle zu Java-Servlets (LiSlets).[29]
Hickey arbeitete ungefähr zweieinhalb Jahre an Clojure, bevor er sie im Oktober 2007 öffentlich veröffentlichte.[30] Ein Großteil dieser Zeit arbeitet ausschließlich Clojure ohne Außenfinanzierung. Am Ende dieser Zeit schickte Hickey eine E -Mail, in der einige Freunde in der Common Lisp -Community die Sprache angekündigt wurden.
Der Entwicklungsprozess ist gemeinschaftsgetrieben[20] und wird am Clojure verwaltet Jira Projektseite.[31] Die Diskussion für allgemeine Entwicklung erfolgt bei der Clojure Google Group.[32] Jeder kann Fragen und Ideen unter Ask.clojure.org einreichen,[33] Um Patches beizutragen, muss man den Clojure -Mitwirkendenvertrag unterzeichnen.[34] JIRA -Probleme werden von einem Team von Screenern bearbeitet, und schließlich genehmigt Rich Hickey die Änderungen.[35]
Clojures Name laut Hickey ist a Wortspiel über das Programmierkonzept "Schließung"Einbeziehen der Buchstaben C, L und j für C#, Lispeln, und Java drei Sprachen, die einen großen Einfluss auf das Design von Clojure hatten.[16]
Grundsätze für die Gestaltung
Rich Hickey entwickelte Clojure, weil er eine moderne wollte Lispeln zum Funktionelle Programmierung, symbiotisch mit den etablierten Java Plattform und konzipiert für Parallelität.[23][24][36][15]
Clojure's Herangehensweise an Zustand ist durch das Konzept der Identität gekennzeichnet,[22] die im Laufe der Zeit als eine Reihe unveränderlicher Zustände dargestellt werden. Da Staaten unveränderliche Werte sind, kann eine beliebige Anzahl von Arbeitnehmern parallel darauf arbeiten, und die Parallelität wird zur Frage der Verwaltung von Änderungen von einem Zustand in einen anderen. Zu diesem Zweck bietet Clojure mehrere veränderliche Referenztypenjeweils eine genau definierte Semantik für den Übergang zwischen Zuständen.[22]
Sprachübersicht
Ausführung | Veröffentlichungsdatum | Hauptmerkmale/Verbesserungen |
---|---|---|
17. Oktober 2007[30] | Erste Veröffentlichung | |
1.0 | 4. Mai 2009[37] | Erste stabile Veröffentlichung |
1.1 | 31. Dezember 2009[38] | Futures |
1.2 | 19. August 2010[39] | Protokolle |
1.3 | 23. September 2011[40] | Verbesserte primitive Unterstützung |
1.4 | 15. April 2012[41] | Leserliterale |
1.5 | 1. März 2013[42] | Reduzierer |
1.5.1 | 10. März 2013[43] | Beheben eines Speicherlecks |
1.6 | 25. März 2014[44] | Java -API, verbesserte Hashing -Algorithmen |
1.7 | 30. Juni 2015[45] | Wandler, Leserbedingungen |
1.8 | 19. Januar 2016[46] | Zusätzliche String -Funktionen, direkte Verknüpfung, Socket -Server |
1.9 | 8. Dezember 2017[47] | Integration mit Spec, Befehlszeilen-Tools |
1.10 | 17. Dezember 2018[48] | Verbesserte Fehlerberichterstattung, Java -Kompatibilität |
1.10.1 | 6. Juni 2019[49] | Arbeiten um eine Java -Leistungsregression und Verbesserung der Fehlerberichterstattung von clojure.main |
1.10.2 | 26. Januar 2021[50] | Java Interoperabilität/Kompatibilitätsverbesserungen und andere wichtige Sprachfixes |
1.10.3 | 4. März 2021[51] | PREP -Unterstützung für Leserbedingungen |
1.11.0 | 22. März 2022[8] | Neue Syntax für das Keyword -Argument -Aufruf, neu clojure.math Namespace, Namespace -Aliasing ohne Laden und neue Helferfunktionen hinzugefügt zu clojure.core |
1.11.1 | 5. April 2022[52] | Rolling zurückrollen unbeabsichtigte Änderung der binären Serialisierung von Objekten von Typen Clojure.lang.Keyword und clojure.lang.arrayseq . |
Letzte Version |
Clojure läuft auf der Java Plattform und als Ergebnis integriert in Java und unterstützt voll und ganz den Anruf von Java -Code von Clojure,[53][15] Und Clojure -Code kann auch von Java aufgerufen werden.[54] Die Community verwendet Tools wie LININGEN Für die Projektautomatisierung und Unterstützung für die Unterstützung für Maven Integration. LININGEN verarbeitet das Projektpaketmanagement und die Abhängigkeiten und wird mit der Clojure -Syntax konfiguriert.[55]
Wie die meisten anderen LISPs ist die Syntax von Clojure aufgebaut S-Expressionen das werden zuerst von einem Leser in Datenstrukturen analysiert, bevor er zusammengestellt wird.[56][15] Clojure Leser Unterstützt die wörtliche Syntax für Karten, sets und Vektoren Zusätzlich zu Listen werden diese direkt mit den genannten Strukturen zusammengestellt.[56] Clojure ist a Lisp-1 und soll nicht mit Code-kompatibel mit anderen LISP-Dialekten gedacht sein, da es seine eigenen Datenstrukturen verwendet, die mit anderen LISPs nicht kompatibel sind.[19]
Als Lisp -Dialekt unterstützt Clojure Funktionen wie erstklassige Objekte, a Read -E -druck -Schleife (Repl) und ein Makrosystem.[6] Clojure Lisp -Makro System ist dem von sehr ähnlich Common Lisp mit der Ausnahme, dass Clojure's Version der Rückquote (bezeichnet als "Syntax -Zitat") qualifiziert Symbole mit ihren Namespace. Dies hilft, unbeabsichtigte Namenserfassung zu verhindern, da die Bindung an den Namespace-qualifizierten Namen verboten ist. Es ist möglich, eine Erfassungsmakroausdehnung zu erzwingen, aber es muss explizit erfolgen. Clojure erlaubt nicht benutzerdefinierte Leser-Makros, aber der Leser unterstützt eine eingeschränktere Form der syntaktischen Erweiterung.[57] Clojure unterstützt Multimethods[58] und für Schnittstelle-ähnliche Abstraktionen haben a Protokoll[59] basierter Polymorphismus und Datentypsystem verwendet Aufzeichnungen,[60] Bereitstellung von Hochleistungs- und Dynamikpolymorphismus, die zur Vermeidung des Ausdrucksproblem.
Clojure hat Unterstützung für faule Sequenzen und fördert das Prinzip von Unveränderlichkeit und anhaltende Datenstrukturen. Als ein funktionale Spracheder Schwerpunkt wird auf Rekursion und Funktionen höherer Ordnung anstelle von Nebeneffektbasis. Automatisch Schwanzanruf Die Optimierung wird nicht unterstützt, da die JVM sie nicht nativ unterstützt.[61][62][63] Es ist möglich, dies explizit zu tun, indem Sie die verwenden wiederkehren
Stichwort.[64] Zum parallel und gleichzeitig Das Programmieren von Clojure bietet Software -Transaktionsspeicher,[65] ein Reaktiv Agentensystem,[1] und Kanal-Basierte gleichzeitige Programmierung.[66]
Clojure 1.7 führte Leserbedingungen ein, indem die Einbettung von Clojure- und ClojureScript -Code in denselben Namespace einbettet.[45][56] Wandler wurden als Methode zum Komponieren von Transformationen hinzugefügt. Wandler ermöglichen Funktionen höherer Ordnung wie z. Karte und falten über jede Quelle von Eingabedaten zu verallgemeinern. Während traditionell diese Funktionen weiter funktionieren SequenzenMit den Wandlern können sie auf Kanälen arbeiten und den Benutzer seine eigenen Modelle für die Transduktion definieren lassen.[67][68][69]
Erweiterbare Datennotation
Erweiterbare Datennotation, oder edn,[70] ist eine Untergruppe der Clojure -Sprache, die als Datenübertragungsformat gedacht ist. Es kann verwendet werden, um Clojure -Datenstrukturen zu serialisieren und zu Deserialisieren, und Clojure selbst verwendet ein Superset von EDN, um Programme darzustellen.
edn wird auf ähnliche Weise verwendet wie JSON oder Xml, hat aber eine relativ große Liste integrierter Elemente, die hier mit Beispielen gezeigt werden:
- Booleschen:
Stimmt
,FALSCH
- Saiten:
"Foo Bar"
- Figuren:
\c
,\Tab
- Symbole:
Name
- Schlüsselwörter:
:Schlüssel
- Ganzzahlen:
123
- Gleitkommazahlen:
3.14
- Listen:
(A B 42)
- Vektoren:
[A B 42]
- Karten:
{: a 1, "foo": bar, [1 2 3] vier}
- Sets:
#{a b [1 2 3]}
- Null:
Null
(a nullartig Wert)
Zusätzlich zu diesen Elementen unterstützt es die Erweiterbarkeit durch die Verwendung von Stichworte, was aus dem Charakter besteht #
gefolgt von einem Symbol. Bei der Begegnung mit einem Tag übergibt der Leser den Wert des nächsten Elements an den entsprechenden Handler, der einen Datenwert zurückgibt. Dies könnte beispielsweise ein markiertes Element sein: #MyApp/Person {: First "Fred": letztes "Mertz"}
, deren Interpretation vom entsprechenden Händler des Lesers abhängt.
Diese Definition von Erweiterungselementen in Bezug auf die anderen vermeidet es, entweder auf Konventionen oder auf Kontext zu stützen, um Elemente zu vermitteln, die nicht in den Basissatz enthalten sind.
Alternative Plattformen
Die primäre Plattform von Clojure ist Java,[18][53] Es gibt jedoch andere Zielimplementierungen. Das bemerkenswerteste davon ist ClojureScript,[71] was zusammenfasst ECMaskript 3,[72] und clojureclr,[73] ein vollständiger Port auf der .NETZ Plattform, interoperabel mit seinem Ökosystem. Eine Umfrage unter der Clojure -Community mit 1.060 Befragten, die 2013 durchgeführt wurden[74] fanden heraus, dass 47% der Befragten sowohl Clojure als auch ClojureScript bei der Arbeit mit Clojure verwendeten. 2014 war diese Zahl auf 55%gestiegen,[75] Im Jahr 2015 basierend auf 2.445 Befragten auf 66%.[76] Beliebte ClojureScript -Projekte umfassen Implementierungen der Reagieren Bibliothek wie Reagenz,[77] neu rahmen,[78] Rum,[79] und om.[80][81]
Andere Implementierungen
Weitere Implementierungen von Clojure auf verschiedenen Plattformen sind:
- Babashka,[82] Native Clojure Scripting Language Hebeling Graalvm Native Bild und Kleiner Clojure -Dolmetscher
- Cljperl,[83] Clojure auf Perl
- Clojureclr,[84] Clojure on CLR, das .Netz virtuelle Maschine.
- Clojerl,[85] Clojure on STRAHL, das Erlang virtuelle Maschine
- Clojure-Py,[86] Clojure in reinem Python
- Clojurer,[87] Clojure on Rost.
- Frettchen,[88] Kompiliert für in sich geschlossene C ++ 11, die auf Mikrocontrollern ausgeführt werden können
- Joker,[89] ein Dolmetscher und Linter geschrieben in gehen
- Las3r,[90] eine Untergruppe von Clojure, die auf dem läuft Aktionen Virtuelle Maschine (die Adobe Flash Player -Plattform)
- Elf,[91] Clojure-inspiriertes Lisp-Dialekt geschrieben in Rpython
- Rouge,[92] Klopfen auf Yarv in Rubin
Popularität
Angesichts des anhaltenden Interesses an funktionaler Programmierung hat sich die Einführung von Clojure durch Softwareentwickler, die die Java -Plattform nutzen, weiter gestiegen. Die Sprache wurde auch von Softwareentwicklern wie Brian Goetz empfohlen.[93][94][95] Eric Evans,[96][97] James Gosling,[98] Paul Graham,[99] und Robert C. Martin.[100][101][102][103] Gedankenwerkewährend der Bewertung funktionaler Programmiersprachen für ihr Technologieradar,[104] beschrieben Clojure 2010 als "eine einfache, elegante Implementierung von LISP on the JVM" und förderte 2012 seinen Status für "Adoption".[105]
In dem "JVM -Ökosystembericht 2018" (der behauptet wurde, "die größte Umfrage aller Java -Entwickler" zu sein, die von Snyk und Java Magazine zusammengestellt wurde, wurde Clojure als zweitreichste Programmiersprache auf dem JVM für "Clojure" erstellt. Hauptanwendungen ".[106] Clojure wird in der Industrie von Unternehmen verwendet[107] wie zum Beispiel Apfel,[108][109] Atlassian,[110] Finanzierungskreis,[111] Netflix,[112] Nubank,[113] Marionette,[114] und Walmart[115] sowie Regierungsbehörden wie z. NASA.[116] Es wurde auch für Creative Computing verwendet, einschließlich visueller Kunst, Musik, Spiele und Poesie.[117]
Werkzeug
Das Werkzeug für die Clojure -Entwicklung hat sich im Laufe der Jahre erheblich verbessert. Das Folgende ist eine Liste einiger beliebter Ides und Textredakteure Mit Plug-Ins, die Unterstützung für die Programmierung in Clojure erhöhen:[118]
- Atom, mit Chlor[119]
- EMACs, mit Apfelwein[120]
- Intellij Ideemit Clojure-Kit[121] oder Kursiv[122] (Eine kostenlose Lizenz ist verfügbar für Nichtkommerziell verwenden)
- Lichttisch
- Vimmit Kamin.vim,[123][124] vim geeignet,[125] oder zaubern (nur Neovim)[126][127]
- Visual Studio -Code, mit Calva[128] oder Klee[129]
Zusätzlich zu den von der Community bereitgestellten Tools des offiziellen Clojure Cli Werkzeug[130] sind auch verfügbar Linux, Mac OS, und Fenster Seit Clojure 1.9.[131]
Funktionen mit gutem Beispiel
Die folgenden Beispiele können in einer Clojure -Reply durchgeführt werden[130] oder eine Online -Repon wie eine auf Repl.it verfügbar.[132]
Einfachheit
Aufgrund seiner starken Betonung der Einfachheit bestehen Clojure -Programme normalerweise hauptsächlich aus Funktionen und einfachen unveränderlichen Datenstrukturen (d. H. Listen, Vektoren, Karten und Sets).
Programmierung an der Reply
Wie andere LISPsEine der ikonischen Funktionen von Clojure ist die interaktive Programmierung am Wiederholung.[133] Beachten Sie, dass in den folgenden Beispielen, in den folgenden Beispielen, ;
Startet einen Zeilenkommentar und ;; =>
Zeigt die erwartete Ausgabe an:
; Definieren Sie eine var (def a 42) ;; => #'Benutzer/a ; Rufen Sie eine Funktion namens `+` auf (+ a 8) ;; => 50 ; Nennen Sie eine Funktion namens "Said?` (eben? a) ;; => wahr ; Definieren Sie eine Funktion, die den Rest von "n" zurückgibt, wenn sie durch 10 geteilt werden (Defn Foo [n] (Rem n 10)) ;; => #'Benutzer/Foo ; Rufen Sie die Funktion auf (Foo a) ;; => 2 ; Drucken Sie die DocString von `rem" aus (Dokument Rem) ;; => ------------------------- clojure.core/rem [num div])) Rest von dividieren Zähler durch Nenner. ; Drucken Sie die Quelle von `rem" aus (Quelle Rem) ;; => (Defn Rem "Rest des Teilens des Zählers durch Nenner." {:hinzugefügt "1.0" :statisch Stimmt :in der Reihe (fn [x y] `(. clojure.lang.numbers (Rest ~x ~y)))} [num div] (. clojure.lang.numbers (Rest num div)))
Namen zur Laufzeit
Im Gegensatz zu anderen Laufzeitumgebungen, in denen Namen kompiliert werden, ist die Laufzeitumgebung von Clojure mit normalen Clojure -Datenstrukturen leicht introspektabel:
; Definieren Sie eine var (def a 42) ;; => #'Benutzer/a ; Holen Sie sich eine Karte aller öffentlichen VARs, die im "User" -Anernamespace interniert sind (NS-Publics 'Benutzer) ;; => {a #'Benutzer/a} ; Verweisen Sie auf die var über "#" (Reader -Makro) und ; sein zugeordnetes Namespace-qualifiziertes Symbol "Benutzer/A" #'Benutzer/a ;; => #'Benutzer/a ; De-Referenz (den Wert von) The Var (Deref #'Benutzer/a) ;; => 42 ; Definieren Sie eine Funktion (mit einem Dokument), die ; Gibt den Rest von "n" zurück, wenn sie durch 10 geteilt werden (Defn Foo "Gibt` (rem n 10) "zurück" " [n] (Rem n 10)) ;; => #'Benutzer/Foo ; Holen Sie sich die Metadaten des VaR `##'user/foo` (Meta #'Benutzer/Foo) ;; => {: Arglisten [n]))Anwesend : doc "Gibt` (rem n 10) "zurück" "Anwesend :Linie 1Anwesend :Säule 1Anwesend :Datei "user.clj"Anwesend :Name FooAnwesend : ns #Namespace[Benutzer]}
Code als Daten (Homoikonizität)
Ähnlich wie andere LISPs, Clojure ist homoikonisch (auch als "Code als Daten" bezeichnet). Im folgenden Beispiel können wir sehen, wie Sie Code schreiben, der den Code selbst ändert:
; Rufen Sie eine Funktion auf (Code) (+ 1 1) ;; => 2 ; Zitieren Sie den Funktionsaufruf ; (Code in Daten verwandeln, eine Liste von Symbolen) (zitieren (+ 1 1)) ;; => (+ 1 1) ; Holen Sie sich das erste Element auf der Liste ; (Betrieb auf Code als Daten) (Erste (zitieren (+ 1 1))) ;; => + ; Holen Sie sich das letzte Element auf der Liste ; (Betrieb auf Code als Daten) (letzte (zitieren (+ 1 1))) ;; => 1 ; Erhalten Sie eine neue Liste, indem Sie die Symbole auf der Originalliste ersetzen ; (Code als Daten manipulieren) (Karte (fn [bilden] (Fall bilden 1 'eines + 'Plus)) (zitieren (+ 1 1))) ;; => (plus eins)
Ausdrucksbetreiber für die Datenumwandlung
Die Threading -Makros (->
, ->>
und Freunde) können syntaktisch die Abstraktion des Rohrleitungen einer Datenerfassung durch eine Reihe von Transformationen ausdrücken:
(->> (Angebot 10) (Karte Inc.) (Filter eben?)) ;; => (2 4 6 8 10)
Dies kann auch unter Verwendung von Wandlern effizienter erreicht werden:
(Reihenfolge (Comp (Karte Inc.) (Filter eben?)) (Angebot 10)) ;; => (2 4 6 8 10)
Thread-safe Management von Identität und Staat
A Thread-safe Generator einzigartiger Seriennummern (wie viele andere Lisp-Dialekte hat Clojure ein integriert Gensym
Funktion, die es intern verwendet):
(def i (Atom 0)) (Defn Erzeugen-Einsatz-ID "Gibt eine eigene numerische ID für jeden Anruf zurück." [] (Tauschen! i Inc.))
Makros
Eine anonyme Unterklasse von java.io.Writer
Das schreibt nichts und ein Makro, das es verwendet, um alle darin enthaltenen Drucke zum Schweigen zu bringen:
(def Bit-Bucket-Writer (Proxy [Java.io.Writer] [] (schreiben [buf] Null) (nah dran [] Null) (spülen [] Null))) (Defmacro Noprint "Bewertet die angegebenen" Forms "mit allen Drucken zu"*out*"zum Schweigen". [& Formen] `(Bindung [*aus* Bit-Bucket-Writer] ~@Formen)) (Noprint (println "Hallo niemand!")) ;; => nil
Sprachinteroperabilität mit Java
Clojure wurde von Grund auf geschaffen, um seine Host -Plattformen als eines seiner Designziele zu betrachten, und sorgt somit hervorragend Sprachinteroperabilität mit Java:
; Rufen Sie eine Instanzmethode auf (.Touppercase "Apfel") ;; => "Apfel" ; Rufen Sie eine statische Methode auf (System/getProperty "java.vm.version") ;; => "12+33" ; Erstellen Sie eine Instanz von `java.util.hashMap` und ; Fügen Sie einige Einträge hinzu (Doto (java.util.hashmap.) (.stellen "Apfel" 1) (.stellen "Banane" 2)) ;; => {"Banana" 2, "Apple" 1} ; Erstellen Sie eine Instanz von `java.util.arrayList` und ; Inkrementieren Sie seine Elemente mit `clojure.core/map` (def al (Doto (Java.util.ArrayList.) (.hinzufügen 1) (.hinzufügen 2) (.hinzufügen 3))) (Map Inc. al) ;; => (2 3 4) ; Zeigen Sie einen Nachrichtendialog mit Java Swing an (javax.swing.joptionpane/showsMessagedialog Null "Hallo Welt!") ;; => nil
Software -Transaktionsspeicher
10 Threads manipulieren eine gemeinsame Datenstruktur, die aus 100 Vektoren besteht, die jeweils 10 (ursprünglich sequentielle) eindeutige Zahlen enthalten. Jeder Thread wählt dann wiederholt zwei zufällige Positionen in zwei zufälligen Vektoren aus und tauscht sie aus. Alle Änderungen an den Vektoren treten bei Transaktionen auf, indem Clojure verwendet wird Software -Transaktionsspeicher System:
(Defn Lauf [NVECS Nitems Nthreads Niters] (Lassen [Vec-Refs (->> (* NVECS Nitems) (Angebot) (hinein [] (Comp (Partition-All Nitems) (Karte vec) (Karte Ref)))) Tauschen #(Lassen [v1 (Rand-in NVECS) v2 (Rand-in NVECS) I1 (Rand-in Nitems) I2 (Rand-in Nitems)] (Dosync (Lassen [TMP (nth @(Vec-Refs v1) I1)] (ändern (Vec-Refs v1) Assoc I1 (nth @(Vec-Refs v2) I2)) (ändern (Vec-Refs v2) Assoc I2 TMP)))) Bericht #(->> Vec-Refs (hinein [] (Comp (Karte Deref) (Karte (fn [v] (Prn v) v)) Katze (unterscheidbar))) (zählen) (println "Unterscheidbar:"))]] (Bericht) (->> #(Dotimes [_ Niters] (Tauschen)) (wiederholen Nthreads) (anwenden PCalls) (Dorun)) (Bericht))) (Lauf 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] Unterscheidbar: 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] Unterscheidbar: 1000 Null
Siehe auch
Verweise
- ^ a b "Agenten und asynchrone Handlungen". Clojure.org. Abgerufen 2019-07-07.
- ^ "Gleichzeitige Programmierung". Clojure.org. Abgerufen 2019-07-07.
- ^ Hickey, reich; Mitwirkende. "core.async". Github.com. Abgerufen 2019-07-07.
{{}}
:|author2=
hat generischen Namen (Hilfe) - ^ "Funktionales Programmieren". Clojure.org. Abgerufen 2019-07-07.
- ^ Nolen, David; Hickey, reich; Mitwirkende. "core.logic". Github.com. Abgerufen 2019-07-07.
{{}}
:|author3=
hat generischen Namen (Hilfe) - ^ a b "Makros". Clojure.org. Abgerufen 2019-07-07.
- ^ Esterhazy, Paulus. "Threading Makros -Handbuch". Clojure.org. Abgerufen 2019-07-07.
- ^ a b Miller, Alex (2022-03-22). "Clojure 1.11.0 Release". Clojure.org.
- ^ Fogus, Michael (2011). "Rich Hickey Q & A" ". Codequarterly.com. Archiviert von das Original Am 2017-01-11.
- ^ Bonnaire-Sergeant, Ambrose (2012). Ein praktisches optionales Typsystem für Clojure (These). Die University of Western Australia.
- ^ "Clojure -Programmierung" (PDF). Oreilly.com. Abgerufen 2013-04-30.
- ^ Hickey, reich. "Clojure -Bücherregal". Amazon.com. Archiviert von das Original Am 2017-10-03. Abgerufen 2019-07-07.
- ^ Baldridge, Timothy. "Elf". Pixielang.org. Abgerufen 2019-07-07.
- ^ Ramachandra, Ramkumar. "Rhein". Github.org. Abgerufen 2019-07-07.
- ^ a b c d e Edwards, Kathryn (2009-08-10). "Der A-Z der Programmiersprachen: Clojure". Computerworld.com.au. Archiviert von das Original Am 2019-08-26.
- ^ a b Hickey, Rich (2009-01-05). "Bedeutung und Aussprache von Clojure". Google.com.
- ^ a b Krill, Paul (2012-03-22). "Clojure Inventor Hickey zielt jetzt auf Android ab". Infoworld.com.
- ^ a b "Clojure". Clojure.org. Abgerufen 2019-07-07.
- ^ a b "Unterschiede mit anderen LISPs". Clojure.org. Abgerufen 2019-07-07.
- ^ a b "Entwicklung". Clojure.org. Abgerufen 2019-07-07.
- ^ Hickey, Rich (2018-11-26). "Open Source geht nicht um Sie". Github.com.
- ^ a b c "Werte und Veränderungen: Clojure's Ansatz zur Identität und des Zustands". Clojure.org. Abgerufen 2019-07-07.
- ^ a b Hickey, reich. "Begründung". Clojure.org. Abgerufen 2019-07-07.
- ^ a b Torre, Charles (2009-10-06). "Experte für Experten: Rich Hickey und Brian Beckman - Inside Clojure". Msdn.com.
- ^ "Clojure/Spec.Alpha". GitHub. 2017-04-26.
- ^ Hickey, Rich (2002-10-16). "[Ann] dotlisp - ein Lisp -Dialekt für .NET". Google.com.
- ^ Hickey, Rich (2013-04-15). "JFLI". SourceForge.net.
- ^ Hickey, Rich (2013-04-03). "Folie - Außenobjektschnittstelle für Lisp". SourceForge.net.
- ^ Hickey, Rich (2013-03-07). "LiSlets". SourceForge.net.
- ^ a b Hickey, Rich (2020-06-12). "Eine Geschichte der Clojure". Verfahren der ACM auf Programmiersprachen. 4 (HOPL): 1–46. doi:10.1145/3386321. Abgerufen 2022-05-07.
- ^ "Clojure". Atlassian.net. Abgerufen 2019-07-07.
- ^ "Clojure". Google.com. Abgerufen 2019-07-07.
- ^ "Clojure Forum". clojure.org. Abgerufen 2020-03-20.
- ^ "Mitwirkungsvertrag". Clojure.org. Abgerufen 2019-07-07.
- ^ "Arbeitsablauf". Clojure.org. Abgerufen 2019-07-07.
- ^ Elmendorf, Dirk (2010-04-01). "Wirtschaftsgröße Geek - Interview mit Rich Hickey, Schöpfer von Clojure". Linuxjournal.com.
- ^ Hickey, Rich (2009-05-04). "Clojure 1.0". Blogspot.com.
- ^ Hickey, Rich (2009-12-31). "Clojure 1.1 Release". Blogspot.com.
- ^ Hickey, Rich (2010-08-19). "Clojure 1.2 Release". Google.com.
- ^ Redinger, Christopher (2011-09-23). "[Ann] Clojure 1.3 veröffentlicht". Google.com.
- ^ Dipert, Alan (2012-04-17). "[Ann] Clojure 1.4 veröffentlicht". Google.com.
- ^ Halloway, Stuart (2013-03-01). "Ann: Clojure 1.5". Google.com.
- ^ Halloway, Stuart (2013-03-10). "Clojure 1.5.1". Google.com.
- ^ Miller, Alex (2014-03-25). "[Ann] Clojure 1.6". Google.com.
- ^ a b Miller, Alex (2015-06-30). "Clojure 1.7 ist jetzt verfügbar". Clojure.org.
- ^ Miller, Alex (2016-01-19). "Clojure 1.8 ist jetzt verfügbar". Clojure.org.
- ^ Miller, Alex (2017-12-08). "Clojure 1.9 ist jetzt verfügbar". Clojure.org.
- ^ Miller, Alex (2018-12-17). "Clojure 1.10 Release". Clojure.org.
- ^ Miller, Alex (2019-06-06). "Clojure 1.10.1 Release". Clojure.org.
- ^ Miller, Alex (2021-01-26). "Clojure 1.10.2 Release". Clojure.org.
- ^ Miller, Alex (2021-03-04). "Clojure 1.10.3 Release". Clojure.org.
- ^ Miller, Alex (2022-04-05). "Clojure 1.11.1 Release". Clojure.org.
- ^ a b "Hosted on the JVM". Clojure.org. Abgerufen 2019-07-07.
- ^ "Java Interop". Clojure.org. Abgerufen 2019-07-07.
- ^ Hagelberg, Phil; Mitwirkende. "LININGEN". LININGEN.org. Abgerufen 2019-07-07.
{{}}
:|author2=
hat generischen Namen (Hilfe) - ^ a b c "Der Leser". Clojure.org. Abgerufen 2019-07-07.
- ^ Hickey, reich. "edn". Github.com. Abgerufen 2019-07-07.
- ^ "Multimethods und Hierarchien". Clojure.org. Abgerufen 2019-07-07.
- ^ "Protokolle". Clojure.org. Abgerufen 2019-07-07.
- ^ "DataTypes: Fittype, DefRecord and Rify". Clojure.org. Abgerufen 2019-07-07.
- ^ Goetz, Brian (2014-11-20). "Stewardship: Die ernüchternden Teile". Youtube.com.
- ^ Rose, John (2007-07-12). "Schwanz ruft in der VM auf". Oracle.com.
- ^ Rose, John (2009-02-11). "Einige Sprachen müssen in der Lage sein, Schwanzaufrufe auszuführen". Java.net.
- ^ "Besondere Formen". Clojure.org. Abgerufen 2019-07-07.
- ^ "Refs und Transaktionen". Clojure.org. Abgerufen 2019-07-07.
- ^ Hickey, Rich (2013-06-28). "Clojure core.async -Kanäle". Clojure.org.
- ^ Hickey, Rich (2014-09-17). "Wandler". Youtube.com.
- ^ Hickey, Rich (2014-08-06). "Wandler kommen". Cognitect.com.
- ^ Hickey, Rich (2014-11-20). "Inside Wandler". Youtube.com.
- ^ "Offizieller EDN Spec". edn-format.org. 2022-04-27.
- ^ "ClojureScript". Clojurescript.org. Abgerufen 2019-07-06.
- ^ "ClojureScript - FAQ (für JavaScript -Entwickler)". Clojurescript.org. Abgerufen 2018-02-04.
- ^ "Clojureclr". Github.com. Abgerufen 2012-06-28.
- ^ Emerick, Chas (2013-11-18). "Ergebnisse der Clojure & ClojureScript -Umfrage 2013". Cemerick.com. Archiviert von das Original Am 2018-10-29. Abgerufen 2019-07-06.
- ^ "State of Clojure 2014 Umfrageergebnisse". Wufoo.com. Abgerufen 2015-09-17.
- ^ Gehtland, Justin (2016-01-28). "State of Clojure 2015 Umfrageergebnisse". Cognitect.com.
- ^ "Reagens". Github.io. Abgerufen 2019-07-06.
- ^ "Neurahmen". Github.com. Abgerufen 2019-07-06.
- ^ Prokopov, Nikita. "Rum". Github.com. Abgerufen 2019-07-06.
- ^ Nolen, David. "Om". Github.com. Abgerufen 2019-07-06.
- ^ Coupland, Tom (2014-01-17). "OM: Verbesserung der Reaktion von Facebook mit Unveränderlichkeit". Infoq.com.
- ^ Borkent, Michiel. "Babashka". babashka.org. Abgerufen 2019-08-19.
- ^ Hu, Wei. "Ein Lisp auf Perl". Metacpan.org. Abgerufen 2019-07-06.
- ^ "Clojure - Clojure CLR". clojure.org. Abgerufen 2022-05-06.
- ^ Facorro, Juan. "Clojerl". Github.com. Abgerufen 2019-07-06.
- ^ Baldridge, Timothy. "Clojure-Py". Github.com. Abgerufen 2019-07-06.
- ^ "Clojurer". Github.com. Abgerufen 2022-03-17.
- ^ Akkaya, Nurullah. "Frettchen". Ferret-Lang.org. Abgerufen 2019-07-06.
- ^ Bataev, Roman. "Joker". Joker-Lang.org. Abgerufen 2019-07-06.
- ^ Kanone, Aemon. "Laz3r". Github.com. Abgerufen 2019-07-06.
- ^ Baldridge, Timothy. "Elf". Pixielang.org. Abgerufen 2019-07-06.
- ^ Connor, Asche. "Rouge". Github.com. Abgerufen 2019-07-06.
- ^ Goetz, Brian (2020-05-24). "Brian Goetz 'Lieblings-Nicht-Java-JVM-Sprache (Teil 1 von 3)". Twitch.tv.
- ^ Goetz, Brian (2020-05-24). "Brian Goetz 'Lieblings-Nicht-Java-JVM-Sprache (Teil 2 von 3)". Twitch.tv.
- ^ Goetz, Brian (2020-05-24). "Brian Goetz 'Lieblings-Nicht-Java-JVM-Sprache (Teil 3 von 3)". Twitch.tv.
- ^ Evans, Eric (2018-08-14). "Modellierungszeit - Eric Evans - Domänengetriebenes Design Europa 2018". Youtube.com.
- ^ Evans, Eric (2014-11-21). "Eric Evans auf Twitter". Twitter.com.
- ^ "James Gostling Treffen mit London Java Community". Youtube.com. 2016-10-11.
- ^ Graham, Paul (2016-05-06). "Paul Graham auf Twitter". Twitter.com.
- ^ Martin, Robert (2019-08-22). "Warum Clojure?". CleanCoder.com.
- ^ Martin, Robert (2018-11-29). "Einble Bob Martin auf Twitter". Twitter.com.
- ^ Martin, Robert (2018-08-01). "Einführung in die funktionale Programmierung". CleanCoders.com.
- ^ Martin, Robert (2017-07-11). "Pragmatische funktionelle Programmierung". CleanCoder.com.
- ^ "Häufig gestellte Fragen - Technologieradar - Thoughtworks". Thodenworks.com. Abgerufen 2019-02-10.
- ^ "Clojure - Technologieradar - Thoughtworks". Thodenworks.com. Abgerufen 2019-02-10.
- ^ Maple, Simon; Binstock, Andrew (2018-10-17). "JVM -Ökosystembericht 2018". Snyk.io.
- ^ "Erfolgsgeschichten". Clojure.org. Abgerufen 2018-10-27.
- ^ Liutikov, Roman (2017-12-17). "Roman Liutikov auf Twitter". Twitter.com.
- ^ "Jobs bei Apple". Apple.com. Abgerufen 2019-07-06.
- ^ Borges, Leonardo (2015-07-07). "Echtzeit Zusammenarbeit mit Clojure". Youtube.com.
- ^ Pither, Jon (2016-10-04). "Clojure in London: Finanzierungskreis - leihen etwas Clojure". Juxt.pro.
- ^ Williams, Alex (2014-08-03). "Die neuen Stack Makers: Adrian Cockcroft auf Sonne, Netflix, Clojure, Go, Docker und mehr". Thenewstack.io.
- ^ "Nubank Adquire Empresa Norte-americana de tecnologia cognitect".
- ^ Price, Chris (2014-04-11). "Eine neue Ära von Anwendungsdiensten bei Puppet Labs". Puppet.com. Abgerufen 2020-08-06.
- ^ Phillips, Marc (2015-07-14). "Walmart läuft Clojure im Maßstab". Cognitect.com.
- ^ "Common-Metadata-Repository". Github.com. Abgerufen 2019-07-06.
- ^ Meier, Carin (2015-05-06). "Creative Computing mit Clojure". Oreilly.com.
- ^ Miller, Alex (2019-02-04). ""State of Clojure 2019" Ergebnisse ". Clojure.org.
- ^ Szabo, Maurício. "Chlor: Socket Repl Client für Clojure und ClojureScript". Atom.io. Abgerufen 2019-07-05.
- ^ Batsov, Bozhidar; Mitwirkende. "Apfelwein: Die Clojure Interactive Development -Umgebung, die rockt". Cider.mx. Abgerufen 2019-07-05.
{{}}
:|author2=
hat generischen Namen (Hilfe) - ^ Shrago, Greg. "Clojure-Kit: Clojure- und ClojureScript-Plugin für intellij-basierte Tools". Jetbrains.com. Abgerufen 2019-07-05.
- ^ Fleming, Colin. "Kursiv: Bietet vollständige Clojure- und ClojureScript -Sprachunterstützung". Jetbrains.com. Abgerufen 2019-07-05.
- ^ Papst, Tim. "cineplace.vim: clojure reples Unterstützung". Vim.org. Abgerufen 2019-07-05.
- ^ Monroe, Dominic (2016-12-13). "Clojure und Vim: Ein Überblick - es ist sehr möglich". Juxt.pro.
- ^ Masashi, Iizuka. "VIM-ICED: Clojure interaktive Entwicklungsumgebung für VIM8/Neovim". Github.com. Abgerufen 2020-03-13.
- ^ Caldwell, Oliver. "Neovim Clojure (Skript) Tooling über Prepl". Github.com. Abgerufen 2019-11-09.
- ^ Caldwell, Oliver (2019-11-06). "Erste Schritte mit Clojure, Neovim und in wenigen Minuten heraufbeschwört". oli.me.uk.
- ^ Strömberg, Peter. "Calva: Clojure & ClojureScript Interaktive Programmierung". Visualstudio.com. Abgerufen 2019-07-05.
- ^ Szabo, Maurício. "Kleeblatt". Visualstudio.com. Abgerufen 2021-01-28.
- ^ a b Miller, Alex. "DEPs und CLI Guide". Clojure.org. Abgerufen 2019-07-08.
- ^ Miller, Alex (2017-12-08). "Clojure 1.9". Cognitect.com.
- ^ "Online Clojure Repl". Repl.it. Abgerufen 2019-07-08.
- ^ "Programmierung an der Repl: Einführung". Clojure.org. Abgerufen 2018-12-04.
Weitere Lektüre
- Sotnikov, Dmitri (2020), Webentwicklung mit Clojure (3. Aufl.), Pragmatischer Bücherregal, ISBN 978-1-68050-682-2
- Olsen, Russ (2018), Clojure bekommen, Pragmatischer Bücherregal, ISBN 978-1-68050-300-5
- Miller, Alex; Halloway, Stuart; Bedra, Aaron (2018), Programmierung von Clojure (3. Aufl.), Pragmatischer Bücherregal, ISBN 978-1-68050-246-6
- Rathore, Amit; Avila, Francis (2015), Clojure in Aktion (2. Aufl.), Manning, ISBN 978-1-61729-152-4
- Higginbotham, Daniel (2015), Clojure für Brave und Wahre, Keine Stärkepresse, ISBN 978-1-59327-591-4
- Gamble, Julian (2015), Clojure -Rezepte, Pearson Publishing, ISBN 978-0-32192-773-6
- Vandgrift, Ben; Miller, Alex (2015), Clojure angewendet, Pragmatischer Bücherregal, ISBN 978-1-68050-074-5
- Rochester, Eric (2015), Clojure -Datenanalyse -Kochbuch (2. Aufl.), Packt Publishing, ISBN 978-1-78439-029-7
- Fogus, Michael; Houser, Chris (2014), Die Freude an Clojure (2. Aufl.), Manning, ISBN 978-1-617291-41-8
- Kelker, Ryan (2013), Clojure für domänenspezifische Sprachen, Packt Publishing, ISBN 978-1-78216-650-4
- Rochester, Eric (2014), Mastering Clojure -Datenanalyse beherrschen, Packt Publishing, ISBN 978-1-78328-413-9
- Emerick, Chas;Carper, Brian;Grand, Christophe (19. April 2012), Clojure -Programmierung, O'Reilly Media, ISBN 978-1-4493-9470-7
- Vanderhart, Luke;Sierra, Stuart (7. Juni 2010), Praktische Clojure, Apress, ISBN 978-1-4302-7231-1
Externe Links
1955 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Lisp 1, 1,5, Lisp 2(verlassen) | ||||||||||||||
MacLisp | ||||||||||||||
Interisp | ||||||||||||||
Mdl | ||||||||||||||
Lisp Machine Lisp | ||||||||||||||
Planen | R5rs | R6rs | R7Rs klein | |||||||||||
NULL | ||||||||||||||
ZIL (Zork Implementierungssprache) | ||||||||||||||
Franz Lisp | ||||||||||||||
Common Lisp | ||||||||||||||
Le lisp | ||||||||||||||
MIT -Schema | ||||||||||||||
T | ||||||||||||||
Chez Schema | ||||||||||||||
EMACS Lisp | ||||||||||||||
Autolisp | ||||||||||||||
Picolisp | ||||||||||||||
EULISP | ||||||||||||||
ISLISP | ||||||||||||||
OpenLisp | ||||||||||||||
PLT -Schema | Schläger | |||||||||||||
Gnu Guile | ||||||||||||||
Visual Lisp | ||||||||||||||
Clojure | ||||||||||||||
Bogen | ||||||||||||||
Lfe | ||||||||||||||
Hy |