Was passiert, in einem Schema 'cond' - Klausel, wenn der 'else' wird ausgelassen?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin in den Prozess des Lernens Schema.Vor kurzem habe ich (zu viel!) Zeit versucht zu finden einen Fehler in einem Programm, bevor ich merkte, mir fehlte der 'else' - Wort in ein cond-Klausel.Aber das Verhalten in solchen Situationen scheint ein wenig seltsam.Experimentieren Sie mit den Bedingungen, mit nur einem einfachen Programm (unten) nach dem " was " wird angezeigt, wie erwartet, in der else-Klausel, sondern bekommt auch angezeigt, aber ohne das 'else', wird angezeigt mit der umgebenden Anführungszeichen und die un-interpretiert neuen Zeile gedruckt wahrsten Sinne des Wortes.Kann jemand mir erklären, was passiert?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
> 
War es hilfreich?

Lösung

"else" ist nur ein synonym für "wahr".Die Art und Weise zu Lesen cond ist als eine Reihe von tests, wobei der erste test, dass die wahren Ursachen dieser form ausgewertet werden.

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

Hier ist Ihre erste

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

cond sieht (eq? x 0) und festgestellt, dass ist falsch.Die nächste Klausel (display "whatever\n").Es sieht an display, und da display nicht nil, es ist wahr.Es wertet den string "whatever\n", das einfach bewertet zu sich selbst.So ist der Wert des cond dann "whatever\n".

Nun, hier ist Sie die zweite:

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

Hier der erste test falsch, und es geht weiter, die zweite, die else und das zu true ausgewertet wird.(Wenn man darüber nachdenkt, was die "else" heißt, in eine normale wenn-dann-sonst:"gilt für alle die Fälle, in denen keine der vorherigen tests wurden wahr.")

Nun, der form nach es ist (display "whatever\n").Das ist eine Funktion, die sendet den string-argument an die Konsole und gibt nichts zurück, weil das ist, was display passiert, zu tun.In einem anderen Schema, es könnte wieder in seine string-Wert als auch drucken es, in welchem Fall man würde sehen

whatever
"whatever\n"

Andere Tipps

In der foo Funktion wertet die cond Aussage als Bedingung display zu testen. Da es in der Tat ein Symbol display genannt ist, wertet es auf true, so wird die "whatever\n" dann als Ergebnis der (foo 2) bewertet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top