afficher >><< masquer ]
SAMPI - Editeur structuré
1. Le Problème et la Proposition
2. Le Langage Primitif de Représentation Textuelle
2.1. Présentation de la Syntaxe Concrète
2.2. Notations
2.3. Exemple de structuration des données
2.4. Exemple de structuration des traitements
2.5. Exemple de structurations connexes
3. Le Langage Complété pour la Structuration des Textes
3.1. Présentation de la Syntaxe Complétée
3.2. Etude quantitative de l'évolution des programmes
3.3. L'édition syntaxique
3.4. étude de cas : le langage LTR3 et l'atelier ENTREPRISE
4. L'Enrichissement du Langage par de Nouveaux Concepts
4.1. Présentation de la Syntaxe Abstraite
4.2. Les difficultés
4.3. Compléter la Syntaxe
5. La Formalisation des Solutions Techniques
5.1. L'évaluation fonctionnelle
5.2. La structuration par les objets
5.3. Modèle sémantique comparé de l'évaluateur
5.3.1. Notations
5.3.2. La fermeture lexicale : le langage Scheme
5.3.22.1. Termes
5.3.22.2. Application
5.3.3. Les Lisps standards : LeLisp
5.3.4. L'évaluation retardées : « Moi aussi »
5.3.5. Lisp parallèle : Symmetric Lisp
5.3.6. Glossaire
5.4. Comparaison critique
5.5. Construction de la Syntaxe Abstraite
6. Les Comparaisons avec d'autres Approches
7. Les Perspectives
8. Les Editeurs
8.0. brisé sur la barrière de la complexité (une fois de plus)
8.1. L'éditeur ligne : Manuel de l'utilisateur
8.2. L'éditeur page : Guide de l'utilisateur
9. Les Aspects d'Implantation
9.1. Contexte d'évaluation
9.2. La Syntaxe Abstraite : Manuel du concepteur
9.3. L'éditeur page : Guide de l'implanteur
Références
Rubrique Perl-Javascript

La fermeture lexicale : le langage Scheme

Références : sur le langage Scheme [AbS 83] [Sch 87].

On présente en premier le langage Scheme parce qu'il répond de la manière la plus satisfaisante à l'interprétation "intuitive" qu'on peut donner d'une λ-expression. La recherche des identificateurs est réalisée statiquement (« lexical scoping ») : ceci facilite beaucoup le travail du compilateur.

1. Termes

2. Application

2. Application

Application

C'est l'application d'une fonction f sur un argument a :

Irep[env-0 (apply f a)]
     Irep[env-0 f] = Iλ[env-lex λu.(env-f rep-f)]
     Irep[env-0 a] = a
= Irep[env-f*:(u:→a):env-lex rep-f]
     où env-f* = Irep[env-f*:(u:→a):env-lex env-f]

env-f* est la forme évaluée de l'environnement local des définitions de f.

L'algorithme étant peu simple, le cas des λ-expressions compliquant encore davantage les choses, on n'a en Scheme qu'un pseudo-parallélisme d'évaluation :

Evaluation

S'agissant du langage Lisp, c'est-à-dire d'un domaine réflexif d'interprétation, on a deux autres fonctions "spéciales" : quote et eval.

Irep[env-0 (quote x)] = x

Irep[env-0 (eval x env)]
     Irep[env-0 x] = x
     Ienv[env-0 env] = env
= Irep[env x]

Scheme demande un environnement d'évaluation pour l'application de eval, qui lui servira de fermeture lexicale.

En particulier, concernant les λ-expressions :

(1) si 

x = (lambda(u) E), env est la fermeture lexicale de la λ-expression :

Irep[env-0 (eval x env)] = Irep[env (lambda(u) E)] = Iλ[env λu.E]

(2) si 

x = Iλ[env λu.E], x n'est pas dans S*, donc x n'est pas un terme Lisp, et l'évaluation échoue.