Cómo usar el intérprete de Scheme online
- Escribe o pega código Scheme en el editor. Restablecer ejemplo recupera el programa inicial, que imprime un factorial, los diez primeros números de Fibonacci y una suma de cuadrados.
- Pulsa Ejecutar o usa Ctrl + Enter (⌘ + Enter en Mac).
- El texto escrito con
display,writeynewlineaparece en el panel Salida. Cuando el programa termina, el valor de la última expresión se imprime como=> valor, salvo que ese valor no esté especificado. Los errores se muestran con el mensaje propio de BiwaScheme. - Elige un límite de tiempo de 5, 15 o 60 segundos. Un bucle infinito se detiene automáticamente, y Detener termina una ejecución al instante.
El intérprete pesa solo unos 0,3 MB, así que la página está lista casi de inmediato. Copiar y main.scm guardan tu programa, y Pantalla completa (Ctrl/⌘ + Mayús + F, Esc para salir) da al editor toda la ventana.
Tu código se ejecuta en un Web Worker dentro de tu navegador y nunca se envía a un servidor. El editor guarda automáticamente tu último programa en el almacenamiento local de tu navegador, por separado para cada compilador de este sitio.
Sobre Scheme y BiwaScheme
Scheme es un dialecto pequeño de Lisp. Los programas son expresiones entre paréntesis, las funciones son valores normales y la recursión es la forma habitual de hacer bucles. Su núcleo diminuto lo convierte en un lenguaje muy usado para enseñar closures, funciones de orden superior e intérpretes.
Esta página ejecuta BiwaScheme 0.8.3, un intérprete de Scheme escrito en JavaScript. Sigue los estándares R6RS y R7RS en su estilo y cubre las características más habituales de Scheme. Aun así, no es una implementación completa de ninguno de los dos estándares.
Qué se admite
- Formas básicas:
define,lambda,let,let*,letrec,if,cond,beginyset!. - Listas y funciones de orden superior:
cons,car,cdr,list,map,applyy datos entrecomillados como'(1 2 3). - Llamadas en cola correctas (proper tail calls), de modo que los bucles escritos como
letcon nombre o como funciones recursivas en cola se ejecutan con un uso constante de pila.
Limitaciones:
- No hay cuadro de entrada. Pon los datos de prueba directamente en el programa.
- No es una implementación estándar completa. Pueden faltar procedimientos específicos de otros Scheme, como MIT Scheme, Racket o Guile.
- Solo se ejecuta el código del editor. No hay archivos que cargar ni gestor de paquetes.
Ejemplo práctico: recursión frente a let con nombre
;; Recursión simple: cada llamada espera a que vuelva la siguiente.
(define (sum-list lst)
(if (null? lst)
0
(+ (car lst) (sum-list (cdr lst)))))
;; let con nombre: un bucle recursivo en cola con un acumulador.
(define (sum-to n)
(let loop ((i 1) (acc 0))
(if (> i n)
acc
(loop (+ i 1) (+ acc i)))))
(display (sum-list '(1 2 3 4))) (newline) ; 10
(sum-to 100000) ; => 5000050000
La última expresión no se muestra, así que su valor aparece como => 5000050000. sum-list acumula sumas pendientes, mientras que sum-to llama a loop en posición de cola y se comporta como un bucle while.
Errores habituales
- Olvidar entrecomillar una lista.
(1 2 3)intenta llamar a1como si fuera una función y falla. Escribe'(1 2 3)o(list 1 2 3). No son lo mismo:'(a b)es una lista de los símbolosayb, mientras que(list a b)evalúa las variables. definefrente alet. Undefinede nivel superior crea un nombre global.letcrea nombres locales que solo existen dentro de su cuerpo. Dentro de unletsimple, un enlace no puede referirse a otro, así que usalet*cuando un valor posterior dependa de uno anterior.displayfrente awrite.displayimprime las cadenas sin comillas.writelas conserva, lo que ayuda al depurar datos.- Igualdad. Usa
=para números,eq?para símbolos yequal?para comparar listas o cadenas por su contenido.
Preguntas frecuentes
¿Esto es un compilador o un intérprete de Scheme?
Un intérprete. BiwaScheme ejecuta tu programa directamente en el navegador, sin un paso de compilación aparte.
¿Qué estándar de Scheme se admite?
BiwaScheme sigue R6RS y R7RS en su estilo y cubre las características más habituales. El código estándar de los libros de texto que usa define, lambda, let, cond, listas y recursión se ejecuta como se espera. El código que depende de las bibliotecas de una implementación concreta puede necesitar cambios.
¿Puedo usarlo para SICP o ejercicios de clase?
Sí, para ejercicios basados en el Scheme básico. Si un ejercicio usa un procedimiento que no está definido, escribe tú mismo una versión pequeña al principio del programa.
¿Por qué mi programa no imprime nada?
Solo display, write y newline producen salida, además de la línea => con el valor de la última expresión. Un programa que termina con un define no muestra ningún valor, porque ese resultado no está especificado.
¿Qué otros lenguajes puedo ejecutar online?
Prueba el Compilador de Clojure online para otro Lisp, el Compilador de Prolog online para programación lógica, o consulta todos los compiladores online.
Actualizado