Scheme - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

Scheme
Lambda lc.svg

Développeur Guy L. Steele et Gerald Jay Sussman
Paradigme programmation fonctionnelle
Typage fort, dynamique
Influencé par Lisp
A influencé JavaScript, Ruby, Hop
Implémentations Bigloo, Gambit, PLT Scheme...

Scheme (prononcer « skiim' ») est un langage de programmation dérivé du langage fonctionnel Lisp, créé dans les années 1970 au Massachusetts Institute of Technology (MIT) par Gerald Jay Sussman et Guy L. Steele.

Le but des créateurs du langage était d'épurer le langage Lisp en conservant les aspects essentiels, la flexibilité et la puissance expressive. Scheme a donc une syntaxe extrêmement simple, avec un nombre très limité de mots-clés. Comme en Lisp, la notation préfixée permet de s'affranchir des opérateurs de précédence. De plus, la puissance des macros de Scheme lui permet de s'adapter à n'importe quel problème, notamment de le rendre orienté objet et donc multi-paradigme.

La spécification de Scheme précise que toutes les implémentations doivent optimiser le cas de la récursion terminale.

Les types de données de base de Scheme sont les booléens, les nombres, qui peuvent être entiers de taille indéfinie, rationnels ou complexes, les caractères ou les symboles, qui sont des variables.

À ceux-là s'ajoutent des types de données composites suivants : chaînes de caractères, vecteurs, paires orientées, listes, listes associatives, tables de hachage et un type particulier générique, la S-expression, dont tous les autres types dérivent, rendant possible la métaprogrammation, c'est-à-dire la possibilité d'étendre le langage avec de nouveaux opérateurs spéciaux.

Aperçu de la syntaxe du langage

Les variables sont typées dynamiquement et leur portée est lexicale :

       (define var1 value)               (let ([var2 value])          ...)      

Listes :

        (cons 1 (cons 2 (cons 3 (cons 4 '()))))      

Cette concaténation peut être abrégée en

        (list 1 2 3 4)      

ou en

        '(1 2 3 4)      

Fonctions : elles sont définies comme des lambda-expressions

        (define fun          (lambda (arg1 arg2)             ...))      

ou plus simplement

        (define (fun arg1 arg2)          ...)      

Application à une liste :

        (apply fun (list value1 value2))      

Evaluations conditionnelles :

        (cond (test1 expr1)              (test2 expr2)              ...              (else exprn))      

et aussi

        (if condition              then-expr              else-expr)      

Exemple 1 - calcul d'une factorielle :

        (define (factorial n)          (if (= n 0)              1              (* n (factorial (- n 1)))))      
       (factorial 5)       ;; => 120      

Exemple 2 - définition d'une fonction map, qui applique une lambda-expression (qui élève son argument au carré) à tous les éléments d'une liste:

        (define (map f lst)          (cond ((null? lst) lst)                (else (cons (f (car lst))                            (map f (cdr lst))))))      
       (map (lambda (x) (* x x)) '(1 2 3 4))       ;;  => (1 4 9 16)      

Versions tail-récursives des deux exemples précédents :

        (define (factorial n)          (let loop ((fact 1)                     (n n))            (cond ((= n 0) fact)                  (else (loop (* n fact) (- n 1))))))      
       (factorial 5)       ;; => 120      
        (define (map f lst)          (do ((lst lst (cdr lst))               (res '() (cons (f (car lst)) res)))              ((null? lst) (reverse res))))      
       (map (lambda (x) (* x x)) '(1 2 3 4))       ;; => (1 4 9 16)      
Page générée en 0.069 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales | Partenaire: HD-Numérique
Version anglaise | Version allemande | Version espagnole | Version portugaise