Was passiert, in einem Schema 'cond' - Klausel, wenn der 'else' wird ausgelassen?
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
>
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.