Frage Was passiert in einer Scheme-Cond-Klausel, wenn das Else weggelassen wird?


Ich bin dabei, Scheme zu lernen. Ich habe kürzlich (zu viel!) Zeit damit verbracht, einen Fehler in einem Programm zu finden, bevor ich merkte, dass ich das 'else' Wort in einer cond-Klausel verpasste. Aber das Verhalten unter solchen Umständen scheint etwas seltsam zu sein. Beim Experimentieren mit den Bedingungen mit nur einem einfachen Programm (unten) wird das 'was auch immer' wie erwartet in der else-Klausel angezeigt, aber auch angezeigt, aber ohne das 'else' wird es mit den umgebenden doppelten Anführungszeichen und dem uninterpretierten neuen angezeigt Linie buchstäblich gedruckt. Kann mir jemand 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
> 

8
2018-05-01 22:37


Ursprung


Antworten:


"else" ist nur ein Synonym für "wahr". Die Art, Cond zu lesen, ist eine Testreihe, bei der der erste Test, der wahr ist, das zu evaluierende Formular verursacht.

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

Hier ist dein erster

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

Cond sieht zu (eq? x 0) und festgestellt, dass das falsch ist. Die nächste Klausel ist (display "whatever\n"). Es schaut an display, und seit display ist nicht nil, das ist wahr. Es wertet dann die Zeichenfolge aus "whatever\n", die sich einfach zu sich selbst auswertet. Also ist der Wert des Cond dann "whatever\n".

Nun, hier ist dein zweiter:

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

Hier ist der erste Test falsch, und es geht weiter zum zweiten else und was wahr ist. (Wenn Sie darüber nachdenken, ist das, was das "sonst" in einem normalen Wenn-dann-sonst bedeutet: "Wahr für alle Fälle, in denen keiner der vorherigen Tests wahr war.")

Jetzt ist die Form, die ihr folgt (display "whatever\n"). Das ist eine Funktion, die das Zeichenfolgenargument an die Konsole sendet und nichts zurückgibt, weil das Display dies tut. In einem anderen Schema könnte es seinen String-Wert zurückgeben und es auch drucken, in diesem Fall würden Sie sehen

whatever
"whatever\n"

16
2018-05-01 22:52



In dem foo Funktion, die cond Anweisung bewertet display als die zu testende Bedingung. Da gibt es ja ein Symbol namens display, es gilt als wahr, so das "whatever\n" wird dann als Ergebnis von ausgewertet (foo 2).


9
2018-05-01 22:43