Que se passe-t-il dans une clause Scheme 'cond' lorsque le 'else' est omis?

StackOverflow https://stackoverflow.com/questions/813587

  •  03-07-2019
  •  | 
  •  

Question

Je suis en train d'apprendre Scheme. J'ai récemment passé (trop!) De temps à essayer de trouver un bogue dans un programme avant de réaliser que le mot "else" manquait dans une clause cond. Mais le comportement dans de telles circonstances semble être un peu étrange. En expérimentant les conditions avec juste un programme simple (ci-dessous), le "quoi que" soit affiché comme prévu dans la clause else, mais également, mais sans le "autre", s'affiche avec les guillemets et le nouveau ligne imprimée littéralement. Quelqu'un peut-il m'expliquer ce qui se passe? TIA.

   (define (foo x)
    (cond ((eq? x 0) (display "zero\n"))
          (display "whatever\n")))

   (define (bar x)
    (cond ((eq? x 0 ) (display "zero\n"))
          (else (display "whatever\n"))))

In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
> 
Était-ce utile?

La solution

" else " est juste un synonyme de "vrai". La façon de lire cond est une série de tests, où le premier test vrai vérifie l’évaluation de la forme.

(cond  ( (test) (do this) )
       ( (test) (do this) ) )

Voici votre premier

 (cond ((eq? x 0) (display "zero\n"))
        (display "whatever\n")))

cond examine (eq? x 0) et détermine que cela est faux. La clause suivante est (affiche "quel que soit \ n") . Cela ressemble à display , et puisque display n'est pas nil , c'est vrai. Il évalue ensuite la chaîne "quel que soit \ n" , qui s’évalue simplement à elle-même. La valeur de cond est donc "quel que soit \ n" .

Maintenant, voici votre deuxième:

(cond ((eq? x 0 ) (display "zero\n"))
       (else (display "whatever\n"))))

Ici, le premier test est faux et il passe au second, else et qui vaut true. (Si vous y réfléchissez, c’est ce que signifie "else" dans une situation normale if-then-else: "true pour tous les cas où aucun des tests précédents n’était vrai.")

Le formulaire qui suit est (affiche "quel que soit \ n") . C'est une fonction qui envoie l'argument de chaîne à la console et ne renvoie rien car c'est ce que l'affichage fait. Dans un autre schéma, il pourrait retourner sa valeur de chaîne et l’imprimer, auquel cas vous verriez

whatever
"whatever\n"

Autres conseils

Dans la fonction foo , l'instruction cond évalue display en tant que condition à tester. Puisqu'il y a bien un symbole appelé display , il est évalué à true, le "quel que soit \ n" soit ensuite évalué en tant que résultat de (foo 2) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top