So nutzen Sie den Online-Clojure-Compiler
- Schreiben Sie Clojure-Code in den Editor oder fügen Sie ihn dort ein. Beispiel zurücksetzen holt das Startprogramm mit einer Fakultät, einer sortierten Liste von Maps,
frequenciesund einer->>-Pipeline zurück. - Drücken Sie Ausführen oder Strg + Enter (⌘ + Enter auf dem Mac).
- Mit
printlnausgegebener Text erscheint im Bereich Ausgabe. Nach dem Lauf wird der Wert des letzten Ausdrucks als=> ...in lesbarerpr-str-Form ausgegeben. Ist dieser Wertnil, etwa wenn das Programm mitprintlnendet, wird nichts Zusätzliches angezeigt. Fehler werden mit ihrer Meldung angezeigt. - Wählen Sie ein Zeitlimit von 5, 15 oder 60 Sekunden oder drücken Sie Stopp, um einen Lauf vorzeitig zu beenden.
Beim ersten Lauf lädt die Seite den Interpreter herunter, etwa 1 MB. Kopieren und main.cljs sichern Ihren Code, und A−/A+ ändern die Textgröße.
Alles läuft in einem Web Worker in Ihrem Browser. Ihr Code wird nie an einen Server gesendet. Der Editor speichert Ihr letztes Programm automatisch in Ihrem Browser, getrennt für jeden Compiler.
Über Clojure, ClojureScript und SCI
Clojure ist ein modernes Lisp, das auf unveränderlichen Datenstrukturen und funktionaler Programmierung aufbaut. Das ursprüngliche Clojure läuft auf der Java Virtual Machine, und ClojureScript ist die Version, die auf JavaScript abzielt. Diese Seite verwendet Scittle 0.8, das SCI, den Small Clojure Interpreter, für den Browser bündelt. SCI interpretiert Ihren Code direkt mit der Semantik von ClojureScript, ganz ohne JVM oder Build-Tool.
Was unterstützt wird
- Definitionen und Kontrollfluss:
def,defn,fnund#(...)-Literale,let,if,when,condsowieloop/recur. - Persistente Collections: Maps, Vektoren, Sets und Listen, Keywords sowie Destrukturierung in
letund in Funktionsargumenten. - Sequenzfunktionen, darunter
map,filter,reduce,sort-by,group-byundfrequencies, außerdem lazy Sequenzen wierangeunditerate. - Threading-Makros
->und->>sowie Atoms für verwalteten veränderlichen Zustand. - JavaScript-Interop im Stil von ClojureScript, etwa in
(js/Math.sqrt 16)oder(.toUpperCase "abc").
Einschränkungen:
- Keine JVM-Interop. Klassen wie
java.util.DateoderThreadgibt es nicht. - Kein Leiningen und keine deps.edn. Externe Bibliotheken lassen sich nicht hinzufügen, daher stehen nur der Code im Editor und die eingebauten Namespaces zur Verfügung.
- Kein Eingabefeld und kein DOM. Definieren Sie Ihre Testdaten im Programm.
Beispiel: Unveränderlichkeit und Threading
(def inventory {:apples 3 :pears 0})
(def restocked (assoc inventory :pears 12))
(println inventory) ; {:apples 3, :pears 0} (unverändert)
(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 gibt eine neue Map zurück und lässt das Original unverändert. Wenn Sie einen Wert brauchen, der sich im Lauf der Zeit ändert, halten Sie ihn in einem Atom und aktualisieren Sie ihn mit swap!. Der letzte Ausdruck ist eine ->>-Pipeline. Sie reicht den Vektor an jeden Schritt als letztes Argument weiter, und ihr Ergebnis wird als => 130 ausgegeben. Verwenden Sie stattdessen ->, wenn der Wert das erste Argument sein soll, wie bei assoc und update auf einer Map.
Unterschiede zu Clojure auf der JVM und häufige Stolperfallen
- Zahlen sind JavaScript-Zahlen. Mit der Semantik von ClojureScript gibt es keine Brüche (Ratios) und keine Big Integers.
(/ 1 3)liefert0.3333333333333333, und sehr große Ganzzahlen verlieren an Genauigkeit. - Es gibt keinen eigenen Zeichentyp. Ein Zeichenliteral wie
\aist ein String mit einem Buchstaben, daher hat(frequencies "mississippi")String-Schlüssel. - Lazy Evaluation verbirgt Seiteneffekte.
(map println xs)gibt möglicherweise nichts aus, wenn das Ergebnis nie verwendet wird. Nutzen Siedoseqoderrun!für Seiteneffekte. - Unendliche Sequenzen.
(range)unditerateenden nie, begrenzen Sie sie daher immer mittake. Geben Sie eine unendliche Sequenz aus, läuft das Programm weiter, bis das Zeitlimit es stoppt. printlnvs.prn.printlngibt Strings innerhalb von Collections ohne Anführungszeichen aus.prnbehält die Anführungszeichen bei, was Daten leichter lesbar macht.
Häufig gestellte Fragen
Ist das echtes Clojure?
Es ist Clojure-Code, der von SCI mit der Semantik von ClojureScript ausgeführt wird, nicht die JVM-Implementierung. Die Kernsprache, die Collections und die Sequenzbibliothek funktionieren auf dieselbe Weise, sodass sich der meiste reine Clojure-Code unverändert ausführen lässt. Java-Interop und JVM-spezifisches Verhalten funktionieren nicht.
Kann ich Bibliotheken hinzufügen oder eine Projektdatei verwenden?
Nein. Leiningen, deps.edn und Maven-Abhängigkeiten sind nicht verfügbar. Jeder Lauf interpretiert die einzelne Datei im Editor.
Warum heißt die Datei main.cljs?
Weil der Code mit der Semantik von ClojureScript ausgeführt wird. Sie können den Inhalt in eine .clj- oder .cljc-Datei einfügen, solange er sich nicht auf JavaScript-Interop stützt.
Welche anderen Sprachen kann ich ausprobieren?
Der Online-Scheme-Interpreter ist ein weiteres Lisp zum Erkunden. Für JavaScript selbst nutzen Sie den Online-JavaScript-Compiler oder sehen Sie sich alle Online-Compiler an.
Aktualisiert