Como usar o interpretador Scheme online
- Escreva ou cole o código Scheme no editor. Restaurar exemplo recupera o programa inicial, que imprime um fatorial, os dez primeiros números de Fibonacci e uma soma de quadrados.
- Pressione Executar ou use Ctrl + Enter (⌘ + Enter no Mac).
- O texto escrito com
display,writeenewlineaparece no painel Saída. Quando o programa termina, o valor da última expressão é impresso como=> valor, a menos que esse valor seja não especificado. Os erros são informados com a mensagem própria do BiwaScheme. - Escolha um tempo limite de 5, 15 ou 60 segundos. Um laço infinito é interrompido automaticamente, e Parar encerra uma execução na hora.
O interpretador tem só cerca de 0,3 MB, então a página fica pronta quase de imediato. Copiar e main.scm salvam o seu programa, e Tela cheia (Ctrl/⌘ + Shift + F, Esc para sair) dá ao editor a janela inteira.
Seu código roda em um Web Worker dentro do seu navegador e nunca é enviado a um servidor. O editor salva automaticamente o seu último programa no armazenamento local do navegador, separadamente para cada compilador deste site.
Sobre o Scheme e o BiwaScheme
Scheme é um dialeto pequeno de Lisp. Os programas são expressões entre parênteses, as funções são valores comuns e a recursão é a forma normal de fazer repetições. O núcleo minúsculo o torna uma linguagem de ensino popular para closures, funções de ordem superior e interpretadores.
Esta página roda o BiwaScheme 0.8.3, um interpretador de Scheme escrito em JavaScript. Ele segue os padrões R6RS e R7RS no estilo e cobre os recursos mais comuns do Scheme. Mesmo assim, não é uma implementação completa de nenhum dos dois padrões.
O que é suportado
- Formas básicas:
define,lambda,let,let*,letrec,if,cond,begineset!. - Listas e funções de ordem superior:
cons,car,cdr,list,map,applye dados com quote, como'(1 2 3). - Chamadas de cauda corretas (proper tail calls), então laços escritos como named
letou funções recursivas de cauda rodam em espaço constante de pilha.
Limitações:
- Sem caixa de entrada. Coloque os dados de teste diretamente no programa.
- Não é uma implementação completa do padrão. Procedimentos específicos de outros Schemes, como MIT Scheme, Racket ou Guile, podem não existir.
- Só o código do editor é executado. Não há arquivos para carregar nem gerenciador de pacotes.
Exemplo prático: recursão vs named let
;; Recursão simples: cada chamada espera a próxima retornar.
(define (sum-list lst)
(if (null? lst)
0
(+ (car lst) (sum-list (cdr lst)))))
;; Named let: um laço recursivo de cauda com um 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
A última expressão não é exibida, então o valor dela aparece como => 5000050000. sum-list acumula somas pendentes, enquanto sum-to chama loop em posição de cauda e se comporta como um laço while.
Armadilhas comuns
- Esquecer o quote de uma lista.
(1 2 3)tenta chamar1como função e falha. Escreva'(1 2 3)ou(list 1 2 3). As duas formas são diferentes:'(a b)é uma lista dos símbolosaeb, enquanto(list a b)avalia as variáveis. definevslet. Umdefineno nível superior cria um nome global.letcria nomes locais que existem apenas dentro do seu corpo. Dentro de umletsimples, uma associação não pode se referir a outra, então uselet*quando um valor posterior depende de um anterior.displayvswrite.displayimprime strings sem aspas.writeas mantém, o que ajuda ao depurar dados.- Igualdade. Use
=para números,eq?para símbolos eequal?para comparar listas ou strings pelo conteúdo.
Perguntas frequentes
Isto é um compilador ou um interpretador de Scheme?
Um interpretador. O BiwaScheme executa o seu programa diretamente no navegador, sem uma etapa de compilação separada.
Qual padrão de Scheme é suportado?
O BiwaScheme segue o R6RS e o R7RS no estilo e cobre os recursos mais comuns. Código padrão de livros didáticos que usa define, lambda, let, cond, listas e recursão roda como esperado. Código que depende das bibliotecas de uma implementação específica pode precisar de ajustes.
Posso usar para o SICP ou para exercícios de curso?
Sim, para exercícios baseados no Scheme básico. Se um exercício usa um procedimento que não está definido, escreva você mesmo uma versão pequena dele no início do programa.
Por que meu programa não imprime nada?
Só display, write e newline produzem saída, além da linha => com o valor da última expressão. Um programa que termina com um define não mostra valor, porque esse resultado é não especificado.
Que outras linguagens posso executar online?
Experimente o Compilador Clojure online para outro Lisp, o Compilador Prolog online para programação em lógica, ou veja todos os compiladores online.
Atualizado