Planche : 1




Le langage Scheme

Revision: 1.12





  Rudiments de Scheme





Christian Queinnec   UPMC--LIP6


Planche : 2


Historique

Lisp 1.5: 1962 (second plus vieux langage après Fortran). Créé par John MacCarthy au MIT.

ML: 1972, Scheme: 1975 (découvert par Steele & Sussmann, MIT).

Scheme est une reconstruction minimale de Lisp. Scheme est décrit par un rapport (actuellement le R5RS ) de 50 pages environ.

Scheme a été normalisé par l'IEEE puis par l'ISO en 1992.


Planche : 3


Les valeurs de base

Les symboles:
Z  Lisp C6H12O11 + * symbole-encore-plus-long? 
La norme Scheme impose l'insensibilité à la casse.

Les nombres:
13 -813 +42
3.1415 -0.2787e+1 
2/3 
Les rationnels ne sont pas toujours présent, pas plus que les bignums.

Les booléens:
#t #F 
#f est la seule valeur representant Faux. Toute valeur différente de #f représente également Vrai.

Les chaînes de caractères:
"Suis-je une corde ?" 
mais aussi "\"" et "\\".


Planche : 4


Les fonctions

Les fonctions sont des êtres prenant des arguments et retournant une valeur.


Planche : 5


Les listes

Les listes débutent par une parenthèse ouvrante et s'achèvent par une parenthèse fermante. Ce sont des structures ordonnées de termes de nature quelconque.


(ceci est une liste)
(une (autre) ((liste)))
(1 un (o n e) #("Attila" 1.0000))
() ; la liste vide


Planche : 6


Les programmes

Les programmes sont représentés par des listes et des symboles.

Quand on pense f(x,y), on écrit en polonaise préfixée (version dite de Cambridge (Massachussetts)):
(f x y) 

La fonction est suivie de ses paramètres.

Premiers programmes:
(- 42)
(+ 1 (* 2 3)) 
Les listes peuvent être hétérogènes. Il existe également les vecteurs qui ont de meilleurs temps d'accès.


Planche : 7


Les prédicats

Ce sont des fonctions à valeur booléennes.
symbol? vector? boolean? string? null?
number? integer? 
pair? procedure? 
equal?
= < > >= <= 
string=? char=? 


Planche : 8


Manipuler des listes


(ceci est une liste)  ®car ceci

(ceci est une liste)  ®cdr (est une liste)

ceci
(est une liste)       ®cons (ceci est une liste)

Les fonctions car et cdr attendent de leur argument qu'il soit une liste non vide. La fonction cons attend de son second argument qu'il soit une liste (éventuellement vide).

car, cdr sont des fonctions. Les fonctions n'altèrent pas leurs arguments.


Planche : 9


Point d'ordre!

Trois concepts différents: nil, () et #f.

nil est un symbole comme un autre (généralement non défini dans les systèmes Scheme).

() est la liste vide (que l'on prononce « nil »). C'est ce que l'on obtient ainsi:
(terme) ®cdr () 
En particulier, la liste vide vaut Vrai.

#f est le booléen Faux.

En Lisp et dans les Scheme pré-r4rs, ils sont (souvent) confondus.


Planche : 10


Contrôle

Tout est parenthésé! Tout a une valeur! Rien n'est superflu!


(if condition alors sinon)

(begin faire1 faire2 ... fairen)

(quote valeur)

(define nom valeur)
(define (nom variables...définition


Planche : 11


Définitions


(define pi 3.1415926535)
(define moi "Je")
(define sept (+ 3 4))

(define (oppose n)
  (- 0 n) )            ; ou (- n)

(define (abs n)        ; Notez les renfoncements
  (if (< n 0)
      (oppose n)
      n ) ) 

(abs 3)  


Planche : 12


Récursion


(mklist n 'e)  ® (e e ... e)

(define (mklist n exp)
  (if (> n 0)
      (cons exp (mklist (- n 1) exp))
      '() ) ) 

(mklist 2 7)     ;   ® (7 7)
(if (> 2 0) (cons 7 (mklist (- 2 1) 7)) '())
(cons 7 (mklist (- 2 1) 7))
(cons 7 (mklist 1 7))
(cons 7 (if (> 1 0) (cons 7 (mklist (- 1 1) 7)) '()))
(cons 7 (cons 7 (mklist 0 7)))
(cons 7 (cons 7 (if (> 0 0) ... '())))
(cons 7 (cons 7 '()))
(cons 7 '(7))
'(7 7) 


Planche : 13


Exercice: concaténation de listes


(append '(e1 e2 ... en) '(t1 t2 ... tp))
  ® (e1 e2 ... en t1 t2 ... tp))

Indice 1:
(append '() '(t1 t2 ... tp))
  ® (t1 t2 ... tp))

Indice 2:
(append '(e1 e2 ... en) '(t1 t2 ... tp))
  ® (e1 ...)) 

Solution:
(define (append l1 l2)
  (if (pair? l1)
      (cons (car l1) (append (cdr l1) l2))
      l2 ) ) 

Attention à prendre la récursion à lisse-poil!
(define (append l1 l2)
  (if (pair? l2)
      (append (reverse (cons (car l2) 
                             (reverse l1) ))
              (cdr l2) )
      l1 ) )  



Planche : 14


Citation

Si les programmes sont représentés par des listes ou des symboles, comment représenter des listes ou des symboles au sein de programmes: comment citer des valeurs dans un programme ?

Par exemple, comment obtenir la liste (ah ah ah) ?

On ne peut écrire (mklist 3 ah)!

Il faut écrire (mklist 3 (quote ah)).


(quote (a b (c d)))    ® (a b (c d))
(quote (mklist 3 (quote ah))) 
     ® (mklist 3 (quote ah))

(mklist 3 (quote ah))  ® (ah ah ah) 

Il existe une notation particulière:
'expression  º (quote expression


Planche : 15


Entrées-sorties

Impression:
(display valeur)
(newline) 

Lecture:
(read) 

Ce sont des fonctions génériques faisant des effets de bord.


Planche : 16


La boucle fondamentale d'interaction


(define (toplevel)
  (display (eval (read)))
  (toplevel) )
(define (read)
  ... (read-char) ... )
(define (display e)
  ... (write-char ...) ... )
(define (eval program ...)
  ... ) 


Planche : 17


Résumé

Des types de données disjoints: symbole, vecteur, liste, nombre, chaîne, procédures (fonctions).

Un langage non typé mais des valeurs typées (et inspectables): Scheme est donc un langage sûr.

Des fonctions (primitives (essentielles) ou déduites), des formes spéciales (seulement 5 essentielles!).


Planche : 18


Terminologie

valeur
Elles sont de première classe. Il n'y a aucune restriction sur leur emploi: elles peuvent apparaître comme argument, résultat, être stockées en liste, vecteur, variable.

argument
Valeur qui sera liée à une variable lors de l'application d'une fonction.

paramètre
programme dont la valeur deviendra un argument.

fonction
ou procédure. Un prédicat est une fonction à valeur booléenne.

variable
représentés par un symbole, mène à une valeur.

forme
un programme représenté par une liste. Ce peut être une forme spéciale ou une application fonctionnelle (l'application d'une fonction à ses arguments).

forme spéciale
une forme préfixée par un mot clé (begin, if, quote et quelques autres) induisant une évaluation particulière.

(define (oppose n)
  ((if (> n 0) + -) n) )
(oppose (oppose (+ 19 99)))  

(+ 19 99) est le paramètre d'opposé.

118 est l'argument d'opposé.

n est la variable d'une fonction unaire, valeur de la variable oppose.

La variable n a pour valeur l'argument 118.

La forme (+ 19 99) a pour valeur 118.

Pas d'ordre d'évaluation des arguments.


Ce document a été traduit de LATEX par HEVEA.