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
I[env-0 (apply f a)]
I[env-0 f] = Iλ[env-lex λu.env-f]
I[env-0 a] = a
= (car (last env-f*:(u:→a)))
où env-f* = I[env-f*:(u:→a):env-0 env-f]
= I[env-0 (alast
(alpha
(argdef u a)
env-f)) ]
argdef rappelle ici l'évaluation habituelle des arguments d'une fonction : l'argument est évalué à l'extérieur de l'environnement de la fonction appelée.
On notera que l'environnement lexical de la fonction est oublié, et qu'on conserve en revanche l'environnement d'appel à l'évaluation de la fonction : on se place donc dans le cas de la liaison dynamique des identificateurs (en particulier quote et eval sont définies à la manière d'un Lisp standard).