Sur le Scheme du MOOC "Programmation Récursive"... jpr, L1-Info, 2016 Pour son MOOC, Christian Queinnec a construit son propre langage Scheme nommé MrScheme, c'est l'une de ses spécialités1. Il utilise donc un dialecte simplifié de Scheme, plutôt plus proche de la norme que Racket (qui a d'autres cibles). Voici quelques différences. • Dans le MOOC, la forme spéciale verifier permet de tester une fonction, c'est un peu l'équivalent de check-expect en Racket. (verifier carre (carre 1) => 1 (carre -2) => 4) <==> (check-expect (carre 1) 1) (check-expect (carre -2) 4) • Les fonctions first et rest se nomment en vrai Scheme respectivement car et cdr qui existent aussi en Racket. Les noms car et cdr viennent du Lisp de 1958, elles font partie du folklore et aucun vrai lispien ne souhaiterait s'en séparer... • Ah, les arbres binaires. J'ai un traitement différent du MOOC, qui est plus général. Je m'intéresse uniquement aux arbres binaires d'expressions algébriques sur les 4 opérations de base, le MOOC traitant des arbres binaires généraux (et même des forêts, sans doute pour le parcours en largeur). Dans mon cours je n'ai pas d'arbre vide : le cas de base est la feuille ! Ne mélanges pas les arbres de L1 et ceux du MOOC même si les principes algorithmiques sont identiques. • La construction (local [...] ...) de Racket ne fait pas partie de la norme Scheme, c'est une exclusivité de Racket. Les constructions MOOC de MrScheme sont celles du Scheme usuel. Vous pouvez aussi les utiliser en Racket ! Par contre notre niveau de langage "Etudiant Avancé" ne vous permettra pas de placer des define directement dans un define sans utiliser local ! Nous le ferons seulement en PF2 en passant au vrai Scheme. Regardons let et let* (mon livre p. 227-229 ou la séquence 2.3 du MOOC) : (let ((x1 e1) (x2 e2) ...) expr), pour parler comme Python, revient à faire (x1,x2,...) = (e1,e2,...), juste le temps d'évaluer expr. Ensuite, x1, x2... reprennent leurs valeurs antérieures s'ils en avaient. (let* ((x1 e1) (x2 e2) ...) expr), pour parler comme Python, revient à faire x1=e1 ; x2=e2 ; ... juste le temps d'évaluer expr. Ensuite, x1, x2... reprennent leurs valeurs s'ils en avaient. Grosso modo (si e1 et e2 ne sont pas des fonctions), c'est équivalent à (local [(define x1 e1) (define x2 e2)] expr) ou encore à (let ((x1 e1)) (let ((x2 e2)) expr)). Pour faire des fonctions locales (par exemple dans une itération), on utilise directement des define internes sans local. • Il est important d'avoir toujours sous les yeux la carte de référence de Mr-Scheme, ainsi que le formulaire.pdf sur Racket pour ne pas se mélanger les pinceaux... • L'utilisation des formes spéciales define, lambda, if, cond, and, or, case est identique. 1 Il a écrit un livre (niveau L3) sur ses techniques : Principe d'implantation de Scheme et Lisp qui figure au catalogue Paracamplus (l'éditeur universitaire qui héberge le MOOC).