Scheme
Scheme (prononciation : /skim/) 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.
Scheme | ||
Date de premiĂšre version | ||
---|---|---|
Paradigme | Fonctionnel | |
Auteurs | Guy L. Steele et Gerald Jay Sussman | |
DerniĂšre version | R7RS () | |
Typage | fort, dynamique | |
Normes | IEEE 1178-1990, ANSI, RnRS | |
Influencé par | Lisp | |
A influencé | JavaScript, Ruby, Hop, Snap! | |
Implémentations | Bigloo, Gambit, PLT Scheme⊠| |
Site web | www.scheme-reports.org | |
Extension de fichier | scm et ss | |
Le but des crĂ©ateurs du langage Ă©tait d'Ă©purer le 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 d'une prĂ©cĂ©dence des opĂ©rateurs. 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[1] 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.
Histoire
Gérald Sussman et Guy Steele sont revenus sur la naissance de Scheme dans un article intitulé The First Report on Scheme Revisited[2] et publié en 1998.
En 1973, Carl Hewitt propose son modĂšle d'acteur et Ă©crit avec ses Ă©tudiants une implĂ©mentation en Lisp appelĂ©e Planner-73, puis PLASMA (acronyme de PLAnner-like System Modeled on Actors). Sussman et Steele voulant mieux comprendre le modĂšle dâHewitt, notamment en le reliant aux notions traditionnelles de la programmation, Ă©crivent un petit interprĂšte Lisp et des primitives pour crĂ©er des acteurs et envoyer des messages entre eux. Ils utilisent la mĂȘme syntaxe pour les fonctions et les acteurs, les premiĂšres Ă©tant des fermetures dĂ©clarĂ©es par le mot clef lambda
et retournant une valeur, et les seconds par alpha
. Les acteurs ne retournant pas, mais appellent des continuations, qui sont les autres acteurs quâil connait.
Le langage est nommĂ© « Schemer », suivant le nommage des langages Planner et Conniver, desquels il sâinspire. Cependant, le systĂšme ITS utilisĂ© Ă lâĂ©poque limite les noms de fichiers Ă 6 caractĂšres, tronquant le nom à « SCHEME ». Sussman et Steele disent ne plus se souvenir de pourquoi ils nâont pas choisi dâabrĂ©ger en « SCHMR », comme Planner et Conniver qui utilisaient « PLNR » et « CNVR ».
Ils dĂ©couvrent, aprĂšs avoir Ă©crit des programmes avec des acteurs, que lâimplĂ©mentation de lâinterprĂšte Ă©tait identique, que le code Ă Ă©valuer concerne des fonctions ou des acteurs, et quâil en Ă©tait de mĂȘme pour le code qui crĂ©e les fonctions et acteurs. La diffĂ©rence entre le fait que seules les fonctions retournent des valeurs et pas les acteurs nâexistait pas dans lâimplĂ©mentation, mais seulement dans les primitives utilisĂ©es dans le corps des dĂ©finitions des fonctions et acteurs. Ils en dĂ©duisent que les acteurs et les fermetures sont en fait le mĂȘme concept, et Hewitt lâa lui-mĂȘme admis plus tard.
Ces dĂ©couvertes sur lâembryon quâĂ©tait alors Scheme ont menĂ© Ă trois conclusions majeures. En premier lieu, le modĂšle dâacteur dâHewitt se reprĂ©sentait parfaitement en λ-calcul. Ce nâĂ©tait pas nouveau en soi pour les thĂ©oriciens de la sĂ©mantique dĂ©notationnelle, mais Scheme a permis dâapporter une dimension pratique Ă ces thĂ©ories. Ensuite, il est apparu que le formalisme simple et petit du λ-calcul peut servir Ă un noyau dâun langage de programmation expressif et puissant[note 1], Scheme est donc un λ-calcul appliquĂ©. Le corollaire est immĂ©diat : la sĂ©mantique dĂ©notationnelle est Ă©quivalente Ă la sĂ©mantique opĂ©rationnelle. Enfin, la quĂȘte dâun langage ultime pour lâintelligence artificielle sâest rĂ©vĂ©lĂ©e tourner en rond, puisque les travaux sur les langages ont commencĂ© par Lisp, suivi de CONVERT, puis Planner, Conniver, PLASMA, lui-mĂȘme suivi par un dialecte simplifiĂ© de Lisp.
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))
Ăvaluations 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)
Mises en Ćuvre
RnRS
Scheme est, avec Common Lisp, le dialecte de Lisp le plus populaire. Comme Lisp, il existe de multiples implĂ©mentations chacune ajoutant des fonctionnalitĂ©s en fonction des besoins de leurs utilisateurs. Un rapport fait rĂ©guliĂšrement le point sur les diffĂ©rentes implĂ©mentations, afin de dĂ©gager une dĂ©finition du langage consensuelle. Ces rapports sont nommĂ©s Revisedn Report on the Algorithmic Language Scheme[note 2], oĂč n est le numĂ©ro de la rĂ©vision, et abrĂ©gĂ©s en RnRS. Leur but est de pouvoir Ă©changer du code entre diffĂ©rentes implĂ©mentations conformes Ă une rĂ©vision donnĂ©e du rapport.
La sixiĂšme rĂ©vision[1] a Ă©tĂ© publiĂ©e en et ratifiĂ©e par 102 personnes, soit 2/3 des votants[3]. Ce rapport est immĂ©diatement controversĂ©, une partie des auteurs des principales implĂ©mentations ont indiquĂ© quâils intĂ©greraient quelques nouveautĂ©s du R6RS, mais pas la totalitĂ© du rapport[4], Marc Feeley considĂšre que le but du R6RS ne pourra pas ĂȘtre atteint et quâil faut travailler sur un nouveau standard.
En 2009, le Scheme Steering Committee a publiĂ© un communiquĂ©[3] dans lequel il rappelle la diversitĂ© des implĂ©mentations de Scheme, qui sont Ă la fois sa faiblesse et sa force. Il annonce que la diversitĂ© actuelle justifie la distinction entre deux langages Scheme, lâun dit small, hĂ©ritant de IEEE Scheme et du R5RS, et un large, hĂ©ritant du R6RS, mais nĂ©anmoins compatibles entre eux. Le Steering Committee crĂ©e deux groupes de travail pour prĂ©parer la nouvelle rĂ©vision (R7RS) du langage.
La premiÚre partie du rapport, dit R7RS-small a été finalisée en [5].
Principales implémentations
- MIT/GNU Scheme
- Chez Scheme (en), un interprĂšte Scheme libre et compilateur commercial pour Microsoft Windows et plusieurs systĂšmes Unix
- Chicken est un compilateur Scheme-vers-C.
- Gambit est un compilateur Scheme-vers-C conforme Ă R5RS.
- Guile est le langage d'extension du projet GNU. L'interprĂšte Scheme est une bibliothĂšque qui peut servir comme langage de script pour des applications.
- Racket, anciennement PLT-Scheme, une suite de programmes incluant un interprÚte (racket), un outil de développement graphique (MrEd), un éditeur orienté pédagogie (DrRacket), et divers composants incluant des bibliothÚques Component object model (COM) et ODBC.
- Kawa est une implémentation de Scheme en Java.
- Scsh ou Scheme Shell est un produit R5RS utilisable comme langage de script systĂšme et interprĂšte de commandes.
- Gauche est un produit R5RS multilingue sous licence BSD, pour programmeurs et administrateurs systĂšmes.
- Bigloo (en) [6] est un compilateur Scheme-vers-C et Scheme-vers-Java qui produit des exécutables compacts et rapides, doté d'un nombre relativement important de bibliothÚques.
- STklos est une implémentation libre du langage Scheme de l'Université de Nice qui est légÚre et efficace.
- Elk est une implémentation libre du langage.
- Le logiciel de retouche d'images GIMP inclut un interprÚte d'un langage dérivé de Scheme, TinyScheme, pour écrire sous forme de script (appelé script-fu) certaines manipulations d'image.
- D'autres produits se trouvent sur la schemers.org FAQ
Différences avec Lisp
Scheme reprend la syntaxe des S-expressions de Lisp en changeant quelques mots clefs. Une expression scheme est soit une valeur atomique (nombre, chaĂźne de caractĂšre, identificateur, etc.), soit une liste dâexpressions. Les diffĂ©rences notables avec Lisp sont :
- Portée lexicale à travers des fermetures ;
- Espace de noms unique pour fonctions et variables : Scheme utilise
define
lĂ oĂč Lisp choisissait oudefvar
oudefun
;
Notes et références
Notes
- Bien que Lisp ait utilisé la notation λ, mais sans savoir gérer les variables libres, le noyau théorique de Lisp reposait sur des équations récursives, et non le λ-calcul.
- Que lâon pourrait traduire par : « ne rĂ©vision du rapport sur le langage algorithmique Scheme ».
Références
- (en) RevisedⶠReport on the Algorithmic Language Scheme.
- (en) Gerald Jay Sussman et Guy L. Steele, Jr., « The First Report on Scheme Revisited », Higher-Order and Symbolic Computation, vol. 11, no 4,â , p. 399-404 (ISSN 1388-3690 et 1573-0557, lire en ligne).
- (en) Scheme Steering Committee Position Statement, 20 août 2009, consulté le 26 janvier 2013.
- (en) Marc Feeley, « Implementors' intentions concerning R6RS », sur lists.r6rs.org, (consulté le ) : « It seems clear to me that few Scheme implementors have the intention to modify their implementation to support R6RS fully. Generally each implementor intends to pick and choose minor R6RS features that will be supported (but not the same set of features for all Scheme implementations). For this reason I believe that R6RS will fail to achieve its goal of allowing the sharing of code between different Scheme subcommunities. We need to start working on a standard that will. ».
- (en) Revised7 Report on the Algorithmic Language Scheme [PDF].
- Bigloo chez inria.fr
Voir aussi
Liens externes
- (fr) Une courte introduction à Scheme. Notes de cours, Jean-Jacques Girardot, Ecole Nationale Supérieure des Mines de Saint-Etienne, 2008.
- (en) The Scheme Programming Language Ă©crit par R. Kent Dybvig.
- (en) Collection de ressources.
- (en) MIT Scheme. Présentation de l'implémentation MIT/GNU et liens vers d'autres ressources.