2010-12-12 47 views
6

Il faut décider, en fonction de la valeur de:L'interpréteur DrRacket utilise-t-il une évaluation d'ordre normal basée sur l'exercice SICP 1.5?

(test de 0 (p))

où test est défini comme:

(define (test x y) 
    (if (= x 0) 
     0 
     y)) 

et p est défini comme:

(define (p) (p)) 

Lorsque j'évalue (test 0 (p)) le dans terpreter va dans une boucle infinie, suggérant qu'il évalue p. Cela montre l'évaluation d'ordre normal, car les opérandes sont évalués avant d'être remplacés par des paramètres. SICP dit que LISP utilise l'évaluation applicative.

+2

Un conseil utile de la suite du texte: la raison pour laquelle il est appelé "ordre-applicatif" est que les opérandes sont évalués avant que l'opérateur soit ** appliqué **. Il y a un peu plus de discussion sur l'évaluation «paresseuse», etc. au chapitre 3, et je ne pouvais absolument pas garder les deux droites jusqu'à ce que je lise, ils auraient vraiment dû l'expliquer plus tôt que le chapitre 4. – spacemanaki

Répondre

13

Cela montre évaluation-ordre normal, parce que les opérandes sont évalués avant d'être remplacés par des paramètres

En fait, vous l'avez obtenu dans le mauvais sens. L'ordre d'application est lorsque les opérandes sont évalués en premier. Normal-order est quand les arguments sont substitués dans l'expression non évaluée. Donc, la raquette utilise l'ordre applicatif parce que comme vous l'avez dit, les arguments sont évalués en premier (sauf si vous utilisez "Lazy Racket" auquel cas elle utilise l'évaluation paresseuse, qui est comme l'ordre normal sauf que chaque argument est évalué au plus une fois).