Comment utiliser le compilateur Clojure en ligne
- Écrivez ou collez du code Clojure dans l'éditeur. Réinitialiser l'exemple ramène le programme de départ avec une factorielle, une liste triée de maps,
frequencieset un pipeline->>. - Appuyez sur Exécuter ou utilisez Ctrl + Entrée (⌘ + Entrée sur Mac).
- Le texte affiché avec
printlnapparaît dans le panneau Sortie. Après l'exécution, la valeur de la dernière forme est affichée sous la forme=> ...dans la représentation lisiblepr-str. Si cette valeur estnil, par exemple quand le programme se termine parprintln, rien de plus n'est affiché. Les erreurs sont affichées avec leur message. - Choisissez une limite de temps de 5, 15 ou 60 secondes, ou appuyez sur Arrêter pour interrompre une exécution plus tôt.
À la première exécution, la page télécharge l'interpréteur, environ 1 Mo. Copier et main.cljs enregistrent votre code, et A−/A+ modifient la taille du texte.
Tout s'exécute dans un Web Worker de votre navigateur. Votre code n'est jamais envoyé à un serveur. L'éditeur enregistre automatiquement votre dernier programme dans votre navigateur, séparément pour chaque compilateur.
À propos de Clojure, ClojureScript et SCI
Clojure est un Lisp moderne construit autour de structures de données immuables et de la programmation fonctionnelle. Le Clojure d'origine s'exécute sur la machine virtuelle Java, et ClojureScript est la version qui cible JavaScript. Cette page utilise Scittle 0.8, qui empaquette SCI, le Small Clojure Interpreter, pour le navigateur. SCI interprète directement votre code avec la sémantique de ClojureScript, sans JVM ni outil de build.
Ce qui est pris en charge
- Définitions et structures de contrôle :
def,defn,fnet littéraux#(...),let,if,when,condetloop/recur. - Collections persistantes : maps, vecteurs, ensembles et listes, mots-clés, et déstructuration dans
letet dans les arguments de fonction. - Fonctions de séquences, dont
map,filter,reduce,sort-by,group-byetfrequencies, ainsi que des séquences paresseuses commerangeetiterate. - Macros de threading
->et->>, et atoms pour un état mutable géré. - Interopérabilité JavaScript à la manière de ClojureScript, comme dans
(js/Math.sqrt 16)ou(.toUpperCase "abc").
Limites :
- Pas d'interopérabilité JVM. Des classes comme
java.util.DateouThreadn'existent pas. - Pas de Leiningen ni de deps.edn. Il n'est pas possible d'ajouter des bibliothèques externes : seuls le code de l'éditeur et les espaces de noms intégrés sont disponibles.
- Pas de zone de saisie ni de DOM. Définissez vos données de test dans le programme.
Exemple pas à pas : immutabilité et threading
(def inventory {:apples 3 :pears 0})
(def restocked (assoc inventory :pears 12))
(println inventory) ; {:apples 3, :pears 0} (inchangé)
(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 renvoie une nouvelle map et laisse l'originale inchangée. Quand vous avez besoin d'une valeur qui évolue dans le temps, gardez-la dans un atom et mettez-la à jour avec swap!. La dernière forme est un pipeline ->>. Il fait passer le vecteur à chaque étape comme dernier argument, et son résultat est affiché sous la forme => 130. Utilisez plutôt -> quand la valeur doit être le premier argument, comme avec assoc et update sur une map.
Différences avec Clojure sur la JVM et pièges courants
- Les nombres sont des nombres JavaScript. Avec la sémantique de ClojureScript, il n'y a ni rationnels ni grands entiers.
(/ 1 3)renvoie0.3333333333333333, et les très grands entiers perdent en précision. - Il n'y a pas de type caractère distinct. Un littéral de caractère comme
\aest une chaîne d'une lettre, donc(frequencies "mississippi")a des clés de type chaîne. - La paresse masque les effets de bord.
(map println xs)peut ne rien afficher si le résultat n'est jamais utilisé. Utilisezdoseqourun!pour les effets de bord. - Les séquences infinies.
(range)etiteratene se terminent jamais, limitez-les donc toujours avectake. Si vous affichez une séquence infinie, l'exécution continue jusqu'à ce que la limite de temps l'arrête. printlnouprn.printlnaffiche les chaînes à l'intérieur des collections sans guillemets.prnconserve les guillemets, ce qui rend les données plus faciles à lire.
Questions fréquentes
Est-ce du vrai Clojure ?
C'est du code Clojure exécuté par SCI avec la sémantique de ClojureScript, et non l'implémentation JVM. Le langage de base, les collections et la bibliothèque de séquences fonctionnent de la même façon, donc la plupart du code Clojure pur s'exécute sans modification. L'interopérabilité Java et les comportements propres à la JVM ne fonctionnent pas.
Puis-je ajouter des bibliothèques ou utiliser un fichier de projet ?
Non. Leiningen, deps.edn et les dépendances Maven ne sont pas disponibles. Chaque exécution interprète le fichier unique de l'éditeur.
Pourquoi le fichier s'appelle-t-il main.cljs ?
Parce que le code s'exécute avec la sémantique de ClojureScript. Vous pouvez coller le contenu dans un fichier .clj ou .cljc, tant qu'il ne repose pas sur l'interopérabilité JavaScript.
Quels autres langages puis-je essayer ?
L'Interpréteur Scheme en ligne est un autre Lisp à explorer. Pour JavaScript lui-même, utilisez le Compilateur JavaScript en ligne, ou consultez tous les compilateurs en ligne.
Mis à jour
Commentaires
Connectez-vous pour noter cet outil.
Partagez une astuce, posez une question ou racontez comment l’outil a fonctionné pour vous.
Aucun commentaire pour l’instant. Soyez le premier à raconter votre expérience.