Références : sur le langage Symmetric Lisp [GJL 87a] [GJL 87c].
De même que dans Scheme les fonctions sont des objets de première classe, en Symmetric Lisp les environnements sont des objets de première classe.
Note : les objets de première classe
La notion d'objet de première classe est une notion très informatique : elle caractérise les objets manipulés par un langage de programmation qui peuvent être : affectés, passés en paramètre d'une fonction, retournés par une fonction, ... Par exemple en Pascal, les entiers sont de première classe, mais non les pointeurs (ils ne peuvent pas être retournés par une fonction).
Au sens strict du terme, dans tous les langages Lisp une fonction est un objet de première classe – grâce entre autre à la fonction eval. Cependant Scheme offre en plus un modèle d'interprétation cohérent : un appel de fonction réalise toujours le même calcul quel que soit le point de programme d'où l'on appelle cette fonction. Pour ce faire, Scheme définit pour chaque fonction un unique contexte d'évaluation : ce contexte correspond très précisément au contexte lexical de définition de la fonction.
On n'a donc plus ici les deux types d'interprétation : Ienv (environnement) et Irep (représentation), puisqu'une valeur peut servir à modifier l'environnement d'évaluation. On ne distingue donc plus pour une valeur les champs env et rep, et on appelle dans la suite une valeur indifféremment env ou rep selon le sens intuitif qu'on lui attache.
1. Termes
2. Manipulation d'environnement
3. Application
On a enfin une autre notion, qui permet de construire par étapes un environnement.
Initialisation
Le symbole d'initialisation d'un environnement ouvert est : open-alpha
I[env-0 (open-alpha)]
= Iω[ ]
qui se représente par :
(alpha *)
(en particulier une forme Iω est de "type" alpha).
Modification
Le symbole de modification est : attach!
I[env-0 (attach! e a)]
I[env-0 e] = Iω[e] = e
I[e:env-0 a] = a
= Iω[a:env]
Une utilisation intéressante de attach! consiste à fournir de nouvelles définitions.
Par exemple :
(def e (open-alpha))
(attach! e (def x 1))
(attach! e (def x 2))
(attach! e (def x 3))
...
construit un environnement qui énumère (tous) les entiers sur le symbole x.
Ceci introduit un problème qui n'a pas été encore abordé : puisqu'on effectue une évaluation parallèle des environnements, l'utilisation d'un symbole non défini ne doit pas provoquer d'erreur – au moins dans un premier temps. Avec la notion d'environnement ouvert, qu'on évalue aussi en parallèle, mais qu'on peut dynamiquement compléter, un tel cas d'utilisation de symbole non défini ne doit pas provoquer d'erreur ; on a donc dans les environnements des définitions dont l'évaluation a été bloquée et qui doivent être évaluées au "bon moment".
Dans ce qui est réalisé, une évaluation bloquée retourne simplement le symbole non évalué. Le "bon moment" est alors le moment où on réévalue la définition une deuxième fois, ce qui ne va pas sans poser quelques problèmes.