Racket, un langage de programmation multi-plate-forme et influencé par Scheme, fait parler de lui en étant disponible dans une nouvelle version 5.0.1 annoncée le 3 août dernier. Les développeurs espèrent bien que le langage remportera un franc succès et deviendra plus connu du public.
Les caractéristiques de Scheme
En créant le
langage fonctionnel Scheme en 1975, Guy L. Steele et Gerald Jay Sussman, tous deux développeurs du
MIT, voulaient élaborer un dialecte de Lisp plus épuré, d'où la syntaxe et la sémantique simple de Scheme.
Le mode d'évaluation de Scheme
Scheme est typé dynamiquement et utilise l'évaluation stricte (ou non-paresseuse). Cela veut dire que les paramètres d'une fonction sont évalués avant l'application de la fonction elle-même. On peut comprendre cela avec un calcul mathématique, qui, dans le cas d'un langage fonctionnel, correspond à une évaluation de fonctions :
(+ 7 (+ 1 1)) → (+ 7 2) → 9
.
La définition de variable utilise le mot clé
define
. Pour une variable x qui vaut 5 définie par
(define x 5)
, l'évaluation remplacera d'abord x par sa valeur :
(+ 2 (+ x 3)) → (+ 2 (+ 5 3)) → (+ 2 8) → 10
.
L'optimisation tail-rec
Le standard de Scheme a pour but d'optimiser la
récursion terminale au travers de toutes ses implémentations. Le compilateur pouvant transformer ce cas de récursivité en itération (une boucle), la
pile d'exécution est économisée. Pour plus d'information sur cette pratique, voyez le
tutoriel sur la récursivité de
bluestorm.
Racket, un langage dérivé de Scheme
Dans le milieu des années 90, Matthias Felleisen a fondé PLT, un groupe de recherche qui proposait des cours et des exercices destinés aux débutants. En janvier 1995, le projet est devenu un environnement de programmation pédagogique. Le 7 juin dernier, PLT Scheme
a changé de nom pour devenir Racket, les développeurs désirant en effet être plus indépendant vis-à-vis du standard de Scheme.
Racket est un langage de programmation multi-paradigmes (fonctionnel, orienté objet) basé sur Scheme. Néanmoins, le développeur a la possibilité de développer lui-même ses propres paradigmes grâce aux
macros, qui constituent une grande caractéristique des langages de la famille de Lisp. Comme Scheme, Racket optimise la récursion terminale et possède lui aussi une évaluation stricte.
Typed Racket
Par défaut, le typage de Racket est dynamique. C'est à dire que que le type est évalué selon les besoins. Avec
Typed Racket le typage peut devenir
statique.
Voici un code écrit en Racket sans Typed Racket :
Code : Scheme - Un code Racket sans Typed Racket | (define-struct pt (x y)) ; on définit une structure nommée pt avec les champs x et y
(define (mag p)
(sqrt (+ (sqr (pt-x p)) (sqr (pt-y p)))))
|
Avec Typed Racket, le code devient :
Code : Scheme - Le même code mais avec Typed Racket cette fois | #lang typed/racket ; on charge typed racket
; on définit la même structure, en précisant que x et y sont des Réels
(define-struct: pt ([x : Real] [y : Real]))
(: mag (pt -> Number)) ; une fonction de type pt -> Number
(define (mag p)
(sqrt (+ (sqr (pt-x p)) (sqr (pt-y p)))))
|
Les développeurs indiquent travailler sur une prochaine optimisation de Typed Racket.
Le module Slideshow
Le module Slideshow est en quelque sorte une bibliothèque de dessin d'images. Par exemple, avec le module Slideshow chargé, quand on tape
> (circle 10)
on obtient en sortie

.
circle est donc une fonction qui prend en argument la taille du cercle en pixels. Si vous transmettez plus d'un paramètre à la fonction
circle, cette dernière renvoie une erreur. Il est aussi possible de nommer le cercle qui a été créé :
(define c (circle 10))
.
La fonction qui suit, nommée « suite », prend en paramètre une autre fonction et affichera à la suite trois images, chacune étant plus grande que l'autre. On exploite ainsi le côté fonctionnel du langage puisque l'argument de la fonction est une fonction :
Code : Scheme - Le code Racket de la fonction « suite » | (define (suite f)
(hc-append 4 (f 5) (f 10) (f 20)))
|
La fonction
hc-append combine les images qu'on lui passe en paramètre, on peut aussi préciser l'espacement entre chacune. Ainsi lorsqu'on tape
> (suite circle)
on a en sortie

.
Cette présentation est très brève. Racket a plusieurs points communs avec Scheme, mais il apporte néanmoins de nouveaux éléments dans le but de se démarquer, comme une multitude de modules.
Les nouveautés de la version 5.0.1
Deux nouveaux arrivants : Datalog et Racklog
Datalog est un langage logique de requêtes (
Prolog restreint) et de règles pour les bases de données déductives et est à présent intégré à Racket.
Toujours dans le domaine de la programmation logique,
Racklog lui est aussi intégré à Racket. Concrètement il offre à Racket une programmation logique comme le langage de programmation Prolog tout en gardant les conventions de code de Racket.
Code : Scheme - Exemple d'utilisation de Racklog pour calculer la longueur d'une liste | ; code d'acieroid, dans le cadre de l'atelier Prolog
(define %length
(%rel (x x1 head tail)
[('() 0)]
[((cons head tail) x)
(%length tail x1)
(%is x (+ x1 1))]))
|
Racket contient également d'autres langages que le Racket lui-même, comme un Scheme R6RS.
Syntaxe
Le macro
define-struct
a maintenant un équivalent
struct
qui a été implémenté pour s'inscrire plus naturellement à la macro
match
pour le
pattern matching, dont voici un exemple d'utilisation :
Code : Scheme - Exemple d'utilisation du pattern matching avec Racket | (match "apple"
[(regexp #rx"p+") 'yes]
[_ 'no])
; renverrait 'yes car « apple » vérifie la regexp
|
Deux nouvelles fonctions d'affichage
eprintf
et
displayln
font leur entrée dans Racket.
On peut également noter l'existence de
ffi/unsafe
, une bibliothèque qui permet d'appeler du code C à l'intérieur d'un programme codé en Racket, sans avoir à réécrire le code C. Initialement nommée
scheme/foreign
, cette bibliothèque a été réarrangée dans la version 5.0.1 de Racket.
Liens et sources
24 Participations
Connectez-vous !
Connectez-vous !
Revenir à la liste des news