Quelle est l’explication de l’exercice 1.6 dans SICP?

Je commence juste à travailler avec SICP (par moi-même, ce n’est pas pour une classe), et je me débat avec l’exercice 1.6 depuis quelques jours et je n’arrive pas à comprendre. C’est celle où Alyssa redéfinit if en termes de cond , comme ceci:

 (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 l’utilise pour réécrire le programme racine carrée (qui fonctionnait parfaitement avec if ):

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

La question demande alors: “Que se passe-t-il quand Alyssa tente de l’utiliser pour calculer des racines carrées? Expliquez.” [Si nécessaire, je suis heureux de reproduire les autres procédures ( good-enough? improve , etc.), faites le moi savoir.]

Maintenant, je sais ce qui se passe: il ne retourne 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 différence subtile qui existe entre if et new-if m’échappe. Tout et tous aide beaucoup apprécié.

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

    new-if est une procédure, et Scheme utilise l’évaluation par ordre applicatif (1.1.5), donc avant même que new-if soit réellement exécuté, il doit d’abord évaluer tous les arguments, qui sont guess et (sqrt-iter (improve guess x) x) . Vous pouvez voir que le dernier argument est une récursivité, qui appelle une nouvelle procédure new-if , c’est ainsi que la boucle infinie se produit.

    L’ordinaire if n’est pas nécessaire d’évaluer d’abord ses arguments, il suffit de suivre le chemin, c’est la différence entre if et new-if . 🙂

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

     (if   ) 

    Pour évaluer une expression if, l’interpréteur commence par évaluer la partie de l’expression. Si le évalué à une valeur vraie, l’interpréteur évalue alors le et renvoie sa valeur. Sinon, il évalue et renvoie sa valeur.