Come usare il compilatore Clojure online
- Scrivi o incolla il codice Clojure nell'editor. Ripristina esempio riporta il programma iniziale con un fattoriale, un elenco ordinato di mappe,
frequenciese una pipeline->>. - Premi Esegui oppure usa Ctrl + Invio (⌘ + Invio su Mac).
- Il testo stampato con
printlncompare nel pannello Output. Dopo l'esecuzione, il valore dell'ultima form viene stampato come=> ...nella forma leggibilepr-str. Se quel valore ènil, per esempio quando il programma termina conprintln, non viene mostrato nient'altro. Gli errori vengono mostrati con il loro messaggio. - Scegli un limite di tempo di 5, 15 o 60 secondi, oppure premi Interrompi per terminare prima un'esecuzione.
Alla prima esecuzione la pagina scarica l'interprete, circa 1 MB. Copia e main.cljs salvano il tuo codice, e A−/A+ cambiano la dimensione del testo.
Tutto gira in un Web Worker nel tuo browser. Il tuo codice non viene mai inviato a un server. L'editor salva automaticamente nel tuo browser l'ultimo programma, separatamente per ogni compilatore.
Informazioni su Clojure, ClojureScript e SCI
Clojure è un Lisp moderno costruito attorno a strutture dati immutabili e alla programmazione funzionale. Il Clojure originale gira sulla Java Virtual Machine, e ClojureScript è la versione che ha come obiettivo JavaScript. Questa pagina usa Scittle 0.8, che racchiude SCI, lo Small Clojure Interpreter, per il browser. SCI interpreta direttamente il tuo codice con la semantica di ClojureScript, senza JVM né strumenti di build.
Cosa è supportato
- Definizioni e flusso di controllo:
def,defn,fne i letterali#(...),let,if,when,condeloop/recur. - Collezioni persistenti: mappe, vettori, insiemi e liste, keyword e destructuring in
lete negli argomenti delle funzioni. - Funzioni sulle sequenze, tra cui
map,filter,reduce,sort-by,group-byefrequencies, più sequenze lazy comerangeeiterate. - Threading macro
->e->>, e atom per lo stato mutabile gestito. - Interoperabilità con JavaScript in stile ClojureScript, come in
(js/Math.sqrt 16)o(.toUpperCase "abc").
Limitazioni:
- Nessuna interoperabilità con la JVM. Classi come
java.util.DateoThreadnon esistono. - Niente Leiningen né deps.edn. Non si possono aggiungere librerie esterne, quindi sono disponibili solo il codice nell'editor e i namespace integrati.
- Nessuna casella di input e nessun DOM. Definisci i tuoi dati di prova nel programma.
Esempio svolto: immutabilità e threading
(def inventory {:apples 3 :pears 0})
(def restocked (assoc inventory :pears 12))
(println inventory) ; {:apples 3, :pears 0} (invariato)
(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 restituisce una nuova mappa e lascia invariata l'originale. Quando ti serve un valore che cambia nel tempo, tienilo in un atom e aggiornalo con swap!. L'ultima form è una pipeline ->>. Passa il vettore a ogni passaggio come ultimo argomento, e il suo risultato viene stampato come => 130. Usa invece -> quando il valore deve essere il primo argomento, come con assoc e update su una mappa.
Differenze rispetto a Clojure su JVM ed errori comuni
- I numeri sono numeri JavaScript. Con la semantica di ClojureScript non ci sono rapporti né interi di grandi dimensioni.
(/ 1 3)restituisce0.3333333333333333, e gli interi molto grandi perdono precisione. - Non esiste un tipo carattere separato. Un letterale carattere come
\aè una stringa di una lettera, quindi(frequencies "mississippi")ha chiavi di tipo stringa. - La laziness nasconde gli effetti collaterali.
(map println xs)può non stampare nulla se il risultato non viene mai usato. Usadoseqorun!per gli effetti collaterali. - Sequenze infinite.
(range)eiteratenon finiscono mai, quindi limitale sempre contake. Se stampi una sequenza infinita, l'esecuzione continua finché il limite di tempo non la ferma. printlncontroprn.printlnstampa le stringhe dentro le collezioni senza virgolette.prnmantiene le virgolette, il che rende i dati più facili da leggere.
Domande frequenti
È vero Clojure?
È codice Clojure eseguito da SCI con la semantica di ClojureScript, non l'implementazione su JVM. Il linguaggio di base, le collezioni e la libreria per le sequenze funzionano allo stesso modo, quindi la maggior parte del codice Clojure puro gira senza modifiche. L'interoperabilità con Java e il comportamento specifico della JVM non funzionano.
Posso aggiungere librerie o usare un file di progetto?
No. Leiningen, deps.edn e le dipendenze Maven non sono disponibili. Ogni esecuzione interpreta l'unico file presente nell'editor.
Perché il file si chiama main.cljs?
Perché il codice gira con la semantica di ClojureScript. Puoi incollare il contenuto in un file .clj o .cljc, purché non si basi sull'interoperabilità con JavaScript.
Quali altri linguaggi posso provare?
L'interprete Scheme online è un altro Lisp da esplorare. Per JavaScript vero e proprio usa il compilatore JavaScript online, oppure vedi tutti i compilatori online.
Aggiornato