Certaines expressions LISP évaluent à eux-mêmes (exemples sont MIT-Scheme REPL, bien que GNU Common Lisp est d'accord):listes LISP et forme normale
1 ]=> 3
;Value: 3
Et sont en forme normale. L'évaluation d'une expression (telle que (+ 2 1)
) peut donc être considérée comme étant une conversion en une forme normale. C'est bien, parce que c'est comme ça que j'ai toujours compris l'évaluation formellement.
Mais avec des listes que nous sommes en difficulté:
1 ]=> (list 3 2)
; Value 16: (3 2)
1 ]=> (3 2)
;The object 3 is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.
Suis-je raison de penser que:
- (beaucoup [0]) Lisps ne sont pas des formes normales pour (non vide) listes, et
- (beaucoup) LISPs n'ont pas la propriété que l'évaluation est la réduction à la forme normale?
Si tel est le cas, n'est-ce pas quelque peu en désaccord avec les formalismes en PLT tels que les systèmes de réécriture abstraits? Quels formalismes alternatifs capturent l'évaluation dans les LISP?
[0] Ou plus exactement, "la plupart des Lisps de premier plan", comme CL, Clojure et Scheme. Mais je serais intéressé par des contre-exemples moins connus!
Il n'y a pas 'forme normale' dans Lisp et l'évaluation n'est pas la conversion à une forme normale. Que toutes les données (autres que les symboles et les listes) s'évaluent elles-mêmes est juste par définition dans les dialectes Lisp ultérieurs. Lisp n'est pas une implémentation de lambda calcul. Il utilise des types spécifiques d'évaluateurs. –