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 (check-expect (carre 1) 1)
(carre 1) => 1 <==> (check-expect (carre -2) 4)
(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).