2017-02-10 1 views
0

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:

  1. (beaucoup [0]) Lisps ne sont pas des formes normales pour (non vide) listes, et
  2. (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!

+3

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. –

Répondre

2

Lisp peut être défini en termes de seulement quelques opérateurs primitifs. How many primitives does it take to build a LISP machine? Ten, seven or five? Donc, vous pourriez considérer qu'il existe une forme normale pour ce que vous obtenez de leur expansion.

Mais Lisp est pas le lambda-calcul. What type of lambda calculus would Lisp loosely be an example of?

Et Lisp wasn't designed to be like the lambda calculus:

Pour utiliser les fonctions comme arguments, il faut une notation pour les fonctions, et il semble naturel d'utiliser le lambda-notation de l'Église. Je n'ai pas compris le reste du livre, donc je n'ai pas été tenté d'essayer de mettre en œuvre son mécanisme plus général de définition des fonctions.
- Histoire de Lisp, note AI Laboratoire Stanford 1979 par J. McCarthy, page 6