Ce document regroupe un ensemble de conseils et de liens vers des ressources externes afin de faciliter l’apprentissage de la programmation fonctionnelle avec Scheme.
Ce document s’adresse à toute personne intéressée par la programmation fonctionnelle (ou par la programmation en général) et ne requiert pas spécialement de connaissances en programmation.
Il faudra néanmoins un niveau correct d’anglais (savoir comprendre un texte avec des termes spécifiques à l’informatique) afin de pouvoir exploiter les ressources données ici. Bien qu’il existe de nombreux documents en français, la plupart sont en anglais et la connaissance de l’anglais est plus que nécessaire de nos jours.
Préférez un système d’exploitation de type Unix et libre. En effet, ces systèmes, encore peu adapté au grand public il y a peu, sont créés « par des développeurs, pour des développeurs » et représentent donc un environment plus adapté à la programmation.
Là où vous passerez le plus de temps lorsque vous programmerez en Scheme, c’est dans votre éditeur, alors, si ce n’est déjà fait, apprenez à vous servir d’un « vrai » éditeur de texte, à savoir GNU Emacs ou Vim (bien qu’il existe de nombreux autres éditeurs de texte corrects, ces deux là sont sûrement les plus adaptés à la programmation). L’utilisation de Vim risque d’être un poil difficile pour les néophytes du fait que ce soit un éditeur modal, contrairement à GNU Emacs. De plus, GNU Emacs possède des modes adaptés à la programmation dans divers langages dérivés du Lisp et bien qu’il soit possible d’avoir un résultat similaire avec des scripts pour Vim, les modes d’Emacs sont plus souples et plus puissants. Nous vous conseillons donc GNU Emacs, quitte à ne l’utiliser que pour le développement en Scheme ou autre langage Lispien.
Si vous utilisez PLT-Scheme, vous aurez sûrement installé drscheme, un .IDE.(Integrated Development Environment, Environnement de Développement Intégré en français, c’est-à-dire un programme contenant principalement un éditeur ainsi que divers outils afin de faciliter le développement d’applications.)
Les deux prochaines sections présentent Vim et GNU Emacs, si vous ne souhaitez pas utiliser ces éditeurs, libre à vous de passer ces sections, mais sachez que ces éditeurs permettent un développement plus aisé, voire souvent plus rapide.
La plupart des distributions GNU/Linux incluent Vim dans leur dépôts logiciels, vous pouvez donc l’installer simplement comme vous installeriez n’importe quel logiciel. Pour les systèmes de type BSD contenant un arbre des ports, le port contenant Vim est la plupart du temps editors/vim. Il faut noter que la plupart de ces systèmes possèdent déjà vi d’installé, mais utilisez plutôt Vim.
Pour Windows ainsi que Mac OS, installez Vim depuis le site officiel.
Une fois Vim installé, vous pouvez de suite apprendre à vous en servir en lançant vimtutor (soit via divers menu (pour Windows notamment), soit directement dans un shell). Notez que vimtutor est aussi disponible en français, en lançant simplement vimtutor fr pour les Unix.
Gvim est aussi disponible et permet d’utiliser plus facilement Vim dans un premier temps, grâce aux menus, n’hésitez donc pas à l’utiliser au début mais n’oubliez pas que pour profiter au mieux de la puissance de Vim, il est mieux d’apprendre les commandes plutôt que de passer par la souris.
quack pour GNU Emacs (ces scripts ne sont pas fait pour être utilisés avec du Scheme, mais avec quelques paramètres ça devrait être faisable):Tout comme Vim, GNU Emacs se trouve inclut dans la plupart des distribution GNU/Linux dans le paquet emacs, ainsi que dans l’arbre des ports des BSD, dans le port editors/emacs. Vous pouvez aussi récupérer GNU Emacs sur le site de GNU.
Au premier lancement d’Emacs, celui ci devrait vous afficher différent liens, dont un vers le tutoriel. Si ce n’est pas le cas, vous pouvez lancer ce tutoriel par le raccourci C-h t (control-h suivit de t).
Nous ne parlerons pas ici de la customization d’Emacs, pour plus d’informations à ce propos, référez vous à la documentation de GNU Emacs.
quackIl existe un mode pour GNU Emacs qui permet de se simplifier la vie lorsqu’on développe en Scheme: quack.
Pour l’installer, placez le fichier téléchargé dans un dossier (~/elisp/ par exemple) et ajoutez ceci à votre ~/.emacs:
1 2 | |
Avec quack chargé, vous aurez de nouveaux raccourcis claviers, spécifiques à quack, plus ou moins pratiques selon les cas:
C-x C-f) en utilisant le nom du fichier situé sous le point si cela est possible ;(define (foo bar) baz) vers la forme (define foo (lambda (bar) baz)) ;Vous aurez aussi accès à de nombreux raccourcis récurrents dans les autres modes (notamment avec Slime ou dans l’emacs-lisp-mode) permettant de simplifier l’évaluation des s-expressions:
*scheme* ;*scheme* (équivalent à C-c C-r suivi de C-c C-z ;*scheme* ;*scheme* ;load ;compile-file ;Grâce à ces raccourcis, vous pouvez donc tester votre code tout au long du développement, ré-évaluer les bouts de codes changés et retester le tout, ce qui est bien plus rapide que de compiler ou évaluer l’entièreté du logiciel à chaque petit changement.
pareditCe mode facilite grandement l’utilisation de parenthèses et est donc très pratique pour éditer du Scheme. Néanmoins, il peut être fortement dérangeant et difficile à prendre en main, n’hésitez donc pas à le désactiver s’il ne vous plait pas.
Pour l’installation, téléchargez paredit.el ici, placez le dans le même dossier que quack.el, et ajoutez ceci à votre .emacs:
1 2 | |
Pour la liste des raccourcis et leurs explications, référez vous à la cheatsheet de paredit.
Quelques liens supplémentaires:
Il existe plusieurs implémentations de Scheme, la plupart respectant le standard R5RS ou R6RS, incluant de nombreuses SRFI et ayant chacune des spécificités. Il est impossible de lister ici toutes les implémentations de Scheme4 mais voici les implémentations principales:
PLT-Scheme est sûrement l’implémentation de Scheme avec le plus d’outils de bibliothèques disponibles, citons par exemple un serveur Web, une GUI, des bindings OpenGL, une bibliothèque pour le rendu HTML, …
Vous pourrez donc développer toutes sortes de logiciels en Scheme avec PLT-Scheme. Cela est encore plus facilité grâce à PLaneT qui regroupe beaucoup de paquets créés par les utilisateurs de PLT-Scheme. Notez que la documentation est extrêmement complète, tant au niveau du standard Scheme qu’aux spécificités de PLT-Scheme.
Guile, en plus de fournir un interpréteur avec un grand nombre de SRFI, permet d’embarquer Scheme dans des applications C comme langage de script. Il est notamment utilisé dans LilyPond, GNU TeXmacs, GnuCash…
Scsh permet l’utilisation de Scheme comme langage de script au même titre que bash, zsh ou tout autre shell.
Avant tout, sachez que la meilleure méthode pour apprendre un langage n’est pas de lire des livres, mais de pratiquer. Certes la lectures de livres vous aiguillera sur le bon chemin, mais rien ne pourra remplacer la pratique qui vous permettra d’assimiler le langage et d’apprendre de vos erreurs.
Nous allons présenter ici uniquement les livres libres à la consultation, bien qu’il en existe d’autres très bons. Notez que la plupart des livres ici peuvent aussi être achetés en version imprimée.
Il existe deux sortes de livres traitant du Scheme:
Intéressons nous d’abord à la première catégorie, plus souvent orientée vers les débutant mais qui présente des concepts fondamentaux souvent non maîtrisés par beaucoup de développeurs. Les livres suivants en font partie:
Si vous avez apprécié le chapitre 4 de SICP 5 ou le chapitre 10 de Concrete Abstraction, vous aimerez aussi Programming Languages: Application and Interpretation: tout au long du livre vous allez mettre en place un interpréteur en Scheme pour un langage assez proche du Scheme. L’approche est légèrement différente entre les trois livres, mais de nombreux points se recoupent.
Passons maintenant à la deuxième catégorie, c’est-à-dire les livres traitant du langage Scheme. Préférez ces livres là si vous avez déjà des connaissances en programmation fonctionnelle:
Sachez enfin que le Scheme Cookbook regroupe de nombreuses recettes (simples programmes destinés à effectuer des tâches précises) très pratiques.
Les spécifications du langage Scheme sont très précises et compréhensible, donc n’hésitez pas à les parcourir.
La dernière spécification en date et le R⁶RS, sortie en 2007. La plupart des implémentations utilisent encore R⁵RS et certaines le R⁴RS.
Vous pouvez aussi trouver énormément d’informations sur la documentation de votre interpréteur, n’hésitez donc pas à la parcourir en cas de problème (dans de nombreux cas vous pouvez même vous référez à la documentation d’autres interpréteurs).
Dernièrement, sachez qu’il existe une assez grande communauté de Schemers que vous pouvez trouver à divers endroits:
#scheme sur irc.freenode.org ;comp.lang.scheme ;Ce document a été formaté grâce à pandoc et . La version markdown est disponible ici et la version originale ici.
Vous êtes autorisés à utiliser, modifier, distribuer ce document sous les termes le la licence Creative Commons Attribution 2.0 (CC-BY).
Tout commentaire est le bienvenu, par mail à quentin point stievenart at google point com.
Les SRFI, pour Scheme Requests for Implementation, sont des bibliothèques qui sont en quelques sortes standardisées qui ajoutent de nombreuses fonctionnalités au standard R6RS. Ces bibliothèques se retrouvent dans de nombreuses implémentations de Scheme et permettent donc d’avoir un ensemble de bibliothèques communes à chaque implémentation plutôt que d’avoir des bibliothèques spécifiques à chaque implémentation. Il en existe à ce jour 72 en version finale.) ↩
le point dans Emacs signifie la position actuelle du curseur, voir le manuel d’Emacs ↩
La compilation d’une /s-expression/ se fait via la fonction compile, qui n’est pas présente dans toutes les implémentations de Scheme. Si votre implémentation de Scheme n’en possède pas, vous pouvez la définir comme suit, afin de simplement évaluer l’expression (ce raccourci devient alors l’équivalent de C-c C-e mais C-c C-c est alors plus pratique que C-c M-e, car plus facile à taper: (define compile (lambda (sexp) (eval sexp))) ↩
Structure and Interpretation of Computer Programs ↩