81 votes

Quelle est l'explication de l'exercice 1.6 dans le SICP?

Je suis juste de commencer à travailler à travers SICP (sur mon propre; ce n'est pas pour une classe), et j'ai eu du mal avec l'Exercice de 1,6 pour un couple de jours et je n'arrive pas à le comprendre. C'est le seul où Alyssa re-définit if en termes de cond, comme suit:

(define (new-if predicate then-clause else-clause)
    (cond (predicate then-clause)
          (else else-clause))

Elle le teste avec succès sur certains cas simples, puis de les utiliser pour la ré-écriture de la racine carrée du programme (ce qui a très bien fonctionné avec if):

(define (sqrt-iter guess x)
    (new-if (good-enough? guess x)
            guess
            (sqrt-iter (improve guess x)
                       x)))

La question alors se pose: "Ce qui se passe quand Alyssa tente de l'utiliser pour calculer des racines carrées? Expliquer." [Si nécessaire, je suis heureux de reproduire les autres procédures (good-enough?, improve, etc.), laissez-moi savoir.]

Maintenant, je sais ce qui se passe: il ne renvoie jamais de valeur, ce qui signifie que le programme se répète à l'infini. Je ne peux pas expliquer pourquoi cela se produit. Quelle que soit la subtile différence qui existe entre if et new-if est faussé compagnie à moi. Toute aide appréciée.

103voto

Greg Hewgill Points 356191

new-if est une fonction. Quand une fonction est appelée, quelle est la première chose que fait Scheme avec la liste des arguments? Il évalue tous les arguments.

59voto

Junjie Zhang Points 91

new-if est une procédure, et le modèle utilise des applicatifs ordre d'évaluation (1.1.5), de sorte que même avant d' new-if est effectivement réalisé, il doit évaluer tous les arguments d'abord, qui sont - guess et (sqrt-iter (improve guess x) x). Vous pouvez voir que le dernier argument est une récursivité, qui appelle un nouveau new-if procédure, c'est comment la boucle infinie se produit.

L'ordinaire, if n'ont pas besoin d'évaluer ses arguments tout d'abord, juste aller le long de la voie, c'est la différence entre if et new-if. :)

29voto

alex vasi Points 2893

Tout d'abord, vous devez comprendre la différence entre applicative afin de l'évaluation et de l'ordre normal. Lisp utilise applicative de l'ordre, mais les expressions conditionnelles ne sont pas évalués comme les fonctions normales (sicp chapitre 1.1.6):

(if <predicate> <consequent> <alternative>)

Pour évaluer une expression if, l'interprète commence par l'évaluation de l' <predicate> de la partie de l'expression. Si l' <predicate> renvoie la valeur true, l'interprète, puis évalue l' <consequent> et retourne sa valeur. Sinon, il évalue l' <alternative> et retourne sa valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X