|
IFT2030 Concepts des langages de programmation Automne 2002 |
Démonstration 6: Introduction à SchemeNote: Le "baratin" de la semaine est un sous-ensemble des notes de démonstrations du cours de Yoshua Bengio (http://www.iro.umontreal.ca/~bengioy/ift2030/A01/Demo1-scheme.htm) Installation et utilisation de l'interprèteToutes les informations relatives à l'interpréteur Gambit Scheme (Marc Feeley) sont dans le site http://www.iro.umontreal.ca/~gambit/ .Vous trouverez aussi des versions pour Mac, Windows et Unix. a) Configuration sous UnixSous Unix, pour lancer l'interpréteur il suffit de tapez :prompt% gsi
b) DocumentationVous trouverez une documentation du langage Scheme dans le site http://www.schemers.org/Documents/Standards/R5RS/HTML/c) Quelques exemples avec l'interpréteurprompt% Gambit Version 3.0> (display "Voici quelques exemples :\n") Voici quelques exemples : > (+ 3 2) 5 > (define (f x) (* 4 x)) > (f 2) 8 > (exit) prompt% > (define (f n) (let ((x 1) (y n)) (+ x y))) > (f 3) 4 > (define s 4) > s 4 > (define t (sqrt 2)) > t 1.4142135623730951 > (f t) 2.414213562373095 > (f s) 5 Types de donnéesLes types de donnés que l'on retrouve dans scheme sont :a)Les nombresScheme ne fait pas de distinction entre entier, ratiennel, réel ou complexe. Les entiers en scheme n'ont pas de limite de taille. Toute suite de chiffres, précédée ou non par le signe - est donc un entier valide avec représentation exacte.
b) Les contantes booléenesLes constantes booléennes en Scheme sont notées:#t #f c) Les caractéres#\a <=> le caractère 'a' en C#\( <=> le caractère '(' en C #\space <=> le caractère ' ' en C #\newline <=> le caractère '\n' en C d) Les chaînes de caractèresLes chaînes de caratères en Scheme sont représentés texte entouré de guillemets. Elles peuvent être formatées en utilisant le caractère le backslash "\". suivit de caractères spéciaux tells que n ( retour à la ligne) t (tabulation)> (define msg "Ceci est un titre \n \t Debut du paragraphe.\n")
e) Les symbolesLes symboles sont représentés par un quote et une suite de cactères. Ils représentent une constante littérale.> (define nom 'Marc)
Les expressionsLes expressions en Scheme sont soit une variable, une constante, un appel de fonction ou une forme spéciale. Lorsque l'on évalue une liste, c'est unappel de fonction qui est réalisé: (a b c) ; appel de la fonction a, avec b et c comme
arguments.
a) Variables et affectations
(define x 5) (define y "hello") (define z 'hello) On utilise l'apostrophe(quote) pour désigner un symbole. Sans le quote, c'est l'évaluation de hello qui serait affecté à z, mais avec le quote, c'est le symbole hello. Les variables définies par define sont visible tout au long d'une session scheme. Structures de contrôlea) ( If (cond) expression1 expression2)Exemple pour le if:>(define (f x) (if (< x 10) (display "c'est petit!") (display "c'est grand!"))) >(f 3) c'est petit! >(f 25) c'est grand! En Scheme, tout ce qui n'est pas égal à
#f est considéré vrai.
b) (begin expression1 expression2 ... expressionp)Cette structure de contrôle permet de controler les effects de bord. >(begin (display "Premiere ligne.")
c) (cond expression1 expression2... expressionp)Cette commande est l'équivalent du case en C >(define (f x) (cond ((<
x 5) (display "c'est petit!"))
les procédures AND, OR
Pour le and, on évalue les expressions de gauche à
droite jusqu'à ce que l'on trouve une expression fausse(on retourne
alors #f) ou que toutes les
>(and (= 2 2) (<
1 2))
Pour le or, on évalue les expressions de gauche à droite jusqu'à ce que l'on trouve une expression non-fausse(on retourne alors cette expression) ou que toutes les expressions sont fausses(dans ce cas, on retourne #f). >(or (= 2 2) (display "hello"))
Quelques procédures intéressantesa) Opérations sur les symbolesPour déterminer si une expression évalue à un symbole, on peut utiliser la fonction symbol? comme suit:(symbol? <expr>) Exemples:
En Scheme, il est possible de convertir les symboles en chaînes de caractères et vice-versa. On utilise à cet effet les deux procédures suivantes: >(symbol->string 'abc)
Le dernier cas montre que certains caractères spéciaux
ne pouvant normalement être contenus dans des symboles peuvent être
utilisés. Ceci n'est
b) Opération sur les procéduresD'abord, il convient de déclarer l'existance du prédicat procédure? qui détermine si une expression évalue à une procédure: >(procedure? +)
c) les procédures de comparaisons eq? eqv? equal?
(eq? <exp1> <exp2>) (eq? '() '()) ; #t (eq? 2 2) ; dépend du compilateur (eq? (list 1 2) (list 1 2)) ; #f
(equal? 'a 'a)
; #t
Entrées / Sortiesa) Affichage d'expression:>(define x (+ 2 3))>(display "Bonjour a vous!") Bonjour a vous! >(display x) 5 >(newline) ; affiche un newline b) Saisie d'expression:>(define y (read)) ; On suppose que l'utilisateur tape (+ 1 2) ici.>y (+ 1 2)
Ecrire un script et SchemePour charger un programme Scheme dans Gambit, utilisez la fonction load:(load "fichier.scm") La commande load lira le fichier donné et interprétera chaque expression contenue dans celui-ci. Travail pratique (pas noté mais fortement recommandé)
|