GNU LilyPond – Extension des fonctionnalités: 1.1.6 Scheme et les procédures

### 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

#### LilyPond — Extension des fonctionnalités v2.22.2 (branche stable).