1.1.6 Scheme et les procédures
Une procédure Scheme est une expression Scheme qui renverra une valeur
issue de son exécution. Les procédures Scheme sont capables de
manipuler des variables qui ne sont pas définies en leur sein.
Définition de procédures
En Scheme, on définit une procédure à l’aide de l’instruction
define
:
(define (nom-fonction argument1 argument2… argumentn)
expression-scheme-qui-donnera-une-valeur-en-retour)
Nous pourrions, par exemple, définir une procédure calculant la moyenne
de deux nombres :
| guile> (define (moyenne x y) (/ (+ x y) 2))
guile> moyenne
#<procedure moyenne (x y)>
|
Une fois la procédure définie, on l’appelle en la faisant suivre, dans
une liste, des arguments qui doivent l’accompagner. Calculons
maintenant la moyenne de 3 et 12 :
| guile> (moyenne 3 12)
15/2
|
Prédicats
Une procédure Scheme chargée de retourner une valeur booléenne s’appelle
un « prédicat » (predicate). Par convention, plutôt que par
nécessité, le nom d’un prédicat se termine par un point
d’interrogation :
| guile> (define (moins-de-dix? x) (< x 10))
guile> (moins-de-dix? 9)
#t
guile> (moins-de-dix? 15)
#f
|
Valeurs de retour
Une procédure Scheme doit toujours renvoyer une valeur de retour, en
l’occurrence la valeur de la dernière expression exécutée par cette
procédure. La valeur de retour sera une valeur Scheme valide, y compris
une structure de donnée complexe ou une procédure.
On peut avoir besoin de regrouper plusieurs expressions Scheme dans une
même procédure. Deux méthodes permettent de combiner des expressions
multiples. La première consiste à utiliser la procédure begin
,
qui permet l’évaluation de plusieurs expressions et renvoie la valeur de
la dernière expression.
| guile> (begin (+ 1 2) (- 5 8) (* 2 2))
4
|
Une deuxième méthode consiste à combiner les expressions dans un bloc
let
. Ceci aura pour effet de créer une série de liens, puis
d’évaluer en séquence les expressions susceptibles d’inclure ces
liens. La valeur renvoyée par un bloc let est la valeur de
retour de la dernière clause de ce bloc :
| guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4))
… (+ (* x y) (/ z x)))
508
|