Cómo usar el compilador de Clojure online
- Escribe o pega código Clojure en el editor. Restablecer ejemplo recupera el programa inicial, con un factorial, una lista ordenada de mapas,
frequenciesy una canalización->>. - Pulsa Ejecutar o usa Ctrl + Enter (⌘ + Enter en Mac).
- El texto impreso con
printlnaparece en el panel Salida. Después de la ejecución, el valor de la última forma se imprime como=> ...en la forma legible depr-str. Si ese valor esnil, por ejemplo cuando el programa termina conprintln, no se muestra nada más. Los errores se muestran con su mensaje. - Elige un límite de tiempo de 5, 15 o 60 segundos, o pulsa Detener para terminar una ejecución antes.
En la primera ejecución la página descarga el intérprete, de aproximadamente 1 MB. Copiar y main.cljs guardan tu código, y A−/A+ cambian el tamaño del texto.
Todo se ejecuta en un Web Worker de tu navegador. Tu código nunca se envía a un servidor. El editor guarda automáticamente tu último programa en tu navegador, por separado para cada compilador.
Sobre Clojure, ClojureScript y SCI
Clojure es un Lisp moderno construido en torno a estructuras de datos inmutables y la programación funcional. El Clojure original se ejecuta en la máquina virtual de Java, y ClojureScript es la versión que apunta a JavaScript. Esta página usa Scittle 0.8, que empaqueta SCI, el Small Clojure Interpreter, para el navegador. SCI interpreta tu código directamente con la semántica de ClojureScript, sin JVM ni herramienta de compilación.
Qué se admite
- Definiciones y control de flujo:
def,defn,fny los literales#(...),let,if,when,condyloop/recur. - Colecciones persistentes: mapas, vectores, conjuntos y listas, palabras clave y desestructuración en
lety en los argumentos de funciones. - Funciones de secuencias, como
map,filter,reduce,sort-by,group-byyfrequencies, además de secuencias perezosas comorangeeiterate. - Macros de encadenamiento
->y->>, y átomos para el estado mutable gestionado. - Interoperabilidad con JavaScript al estilo de ClojureScript, como en
(js/Math.sqrt 16)o(.toUpperCase "abc").
Limitaciones:
- Sin interoperabilidad con la JVM. Clases como
java.util.DateoThreadno existen. - Sin Leiningen ni deps.edn. No se pueden añadir bibliotecas externas, así que solo están disponibles el código del editor y los espacios de nombres integrados.
- Sin cuadro de entrada y sin DOM. Define tus datos de prueba en el programa.
Ejemplo práctico: inmutabilidad y encadenamiento
(def inventory {:apples 3 :pears 0})
(def restocked (assoc inventory :pears 12))
(println inventory) ; {:apples 3, :pears 0} (sin cambios)
(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 devuelve un mapa nuevo y deja el original sin cambios. Cuando necesitas un valor que cambie con el tiempo, guárdalo en un átomo y actualízalo con swap!. La última forma es una canalización ->>. Pasa el vector por cada paso como último argumento, y su resultado se imprime como => 130. Usa -> en su lugar cuando el valor deba ser el primer argumento, como ocurre con assoc y update en un mapa.
Diferencias con Clojure en la JVM y errores habituales
- Los números son números de JavaScript. Con la semántica de ClojureScript no hay fracciones ni enteros grandes.
(/ 1 3)devuelve0.3333333333333333, y los enteros muy grandes pierden precisión. - No hay un tipo de carácter independiente. Un literal de carácter como
\aes una cadena de una letra, así que(frequencies "mississippi")tiene claves de tipo cadena. - La pereza oculta los efectos secundarios.
(map println xs)puede no imprimir nada si el resultado nunca se usa. Usadoseqorun!para los efectos secundarios. - Secuencias infinitas.
(range)eiteratenunca terminan, así que limítalas siempre contake. Si imprimes una secuencia infinita, la ejecución continúa hasta que el límite de tiempo la detiene. printlnfrente aprn.printlnimprime las cadenas dentro de las colecciones sin comillas.prnconserva las comillas, lo que hace los datos más fáciles de leer.
Preguntas frecuentes
¿Esto es Clojure de verdad?
Es código Clojure ejecutado por SCI con la semántica de ClojureScript, no la implementación de la JVM. El lenguaje base, las colecciones y la biblioteca de secuencias funcionan igual, así que la mayor parte del código Clojure puro se ejecuta sin cambios. La interoperabilidad con Java y el comportamiento específico de la JVM no funcionan.
¿Puedo añadir bibliotecas o usar un archivo de proyecto?
No. Leiningen, deps.edn y las dependencias de Maven no están disponibles. Cada ejecución interpreta el único archivo del editor.
¿Por qué el archivo se llama main.cljs?
Porque el código se ejecuta con la semántica de ClojureScript. Puedes pegar el contenido en un archivo .clj o .cljc, siempre que no dependa de la interoperabilidad con JavaScript.
¿Qué otros lenguajes puedo probar?
El Intérprete de Scheme online es otro Lisp para explorar. Para JavaScript en sí, usa el Compilador de JavaScript online, o consulta todos los compiladores online.
Actualizado