Comment utiliser l'interpréteur Scheme en ligne
- Écrivez ou collez du code Scheme dans l'éditeur. Réinitialiser l'exemple rétablit le programme de départ, qui affiche une factorielle, les dix premiers nombres de Fibonacci et une somme de carrés.
- Cliquez sur Exécuter ou utilisez Ctrl + Entrée (⌘ + Entrée sur un Mac).
- Le texte écrit avec
display,writeetnewlineapparaît dans le panneau Sortie. À la fin du programme, la valeur de la dernière expression est affichée sous la forme=> valeur, sauf si cette valeur est non spécifiée. Les erreurs sont signalées avec le message propre à BiwaScheme. - Choisissez une limite de temps de 5, 15 ou 60 secondes. Une boucle infinie est arrêtée automatiquement, et Arrêter met fin à une exécution immédiatement.
L'interpréteur ne pèse qu'environ 0,3 Mo, la page est donc prête presque instantanément. Copier et main.scm enregistrent votre programme, et Plein écran (Ctrl/⌘ + Maj + F, Échap pour quitter) donne toute la fenêtre à l'éditeur.
Votre code s'exécute dans un Web Worker à l'intérieur de votre navigateur et n'est jamais envoyé à un serveur. L'éditeur enregistre automatiquement votre dernier programme dans le stockage local de votre navigateur, séparément pour chaque compilateur de ce site.
À propos de Scheme et de BiwaScheme
Scheme est un petit dialecte de Lisp. Les programmes sont des expressions entre parenthèses, les fonctions sont des valeurs ordinaires et la récursivité est la façon normale de boucler. Son noyau minuscule en fait un langage d'enseignement très répandu pour les fermetures (closures), les fonctions d'ordre supérieur et les interpréteurs.
Cette page exécute BiwaScheme 0.8.3, un interpréteur Scheme écrit en JavaScript. Il suit dans son esprit les normes R6RS et R7RS et couvre les fonctionnalités Scheme les plus courantes. Ce n'est toutefois une implémentation complète d'aucune des deux normes.
Ce qui est pris en charge
- Formes de base :
define,lambda,let,let*,letrec,if,cond,beginetset!. - Listes et fonctions d'ordre supérieur :
cons,car,cdr,list,map,applyet les données citées comme'(1 2 3). - Appels terminaux (tail calls) corrects, si bien que les boucles écrites avec un
letnommé ou des fonctions récursives terminales s'exécutent avec une pile de taille constante.
Limites :
- Pas de zone de saisie. Placez vos données de test directement dans le programme.
- Pas une implémentation complète d'une norme. Les procédures propres à d'autres Scheme, comme MIT Scheme, Racket ou Guile, peuvent être absentes.
- Seul le code de l'éditeur s'exécute. Il n'y a aucun fichier à charger et aucun gestionnaire de paquets.
Exemple pas à pas : récursivité et let nommé
;; Récursivité simple : chaque appel attend le retour du suivant.
(define (sum-list lst)
(if (null? lst)
0
(+ (car lst) (sum-list (cdr lst)))))
;; Let nommé : une boucle récursive terminale avec un accumulateur.
(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 dernière expression n'est pas affichée, sa valeur apparaît donc sous la forme => 5000050000. sum-list accumule des additions en attente, tandis que sum-to appelle loop en position terminale et se comporte comme une boucle while.
Pièges courants
- Oublier de citer (quote) une liste.
(1 2 3)essaie d'appeler1comme une fonction et échoue. Écrivez'(1 2 3)ou(list 1 2 3). Les deux diffèrent :'(a b)est une liste des symbolesaetb, alors que(list a b)évalue les variables. defineoulet. Undefinede premier niveau crée un nom global.letcrée des noms locaux qui n'existent que dans son corps. Dans unletsimple, une liaison ne peut pas faire référence à une autre ; utilisez donclet*quand une valeur dépend d'une valeur précédente.displayouwrite.displayaffiche les chaînes sans guillemets.writeles conserve, ce qui aide à déboguer des données.- Égalité. Utilisez
=pour les nombres,eq?pour les symboles etequal?pour comparer des listes ou des chaînes selon leur contenu.
Questions fréquentes
Est-ce un compilateur ou un interpréteur Scheme ?
Un interpréteur. BiwaScheme exécute votre programme directement dans le navigateur, sans étape de compilation séparée.
Quelle norme Scheme est prise en charge ?
BiwaScheme suit dans son esprit R6RS et R7RS et couvre les fonctionnalités les plus courantes. Le code type des manuels qui utilise define, lambda, let, cond, les listes et la récursivité s'exécute comme prévu. Le code qui dépend des bibliothèques d'une implémentation particulière peut nécessiter des modifications.
Puis-je l'utiliser pour SICP ou des exercices de cours ?
Oui, pour les exercices fondés sur le Scheme de base. Si un exercice utilise une procédure qui n'est pas définie, écrivez-en vous-même une petite version au début du programme.
Pourquoi mon programme n'affiche-t-il rien ?
Seuls display, write et newline produisent une sortie, ainsi que la ligne => pour la valeur de la dernière expression. Un programme qui se termine par un define n'affiche aucune valeur, car ce résultat est non spécifié.
Quels autres langages puis-je exécuter en ligne ?
Essayez le Compilateur Clojure en ligne pour un autre Lisp, le Compilateur Prolog en ligne pour la programmation logique, ou parcourez tous les compilateurs en ligne.
Mis à jour