Ich bin gerade 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 Wort "else" 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.
%Vor%"else" ist nur ein Synonym für "true". Der Weg, Cond zu lesen, ist eine Reihe von Tests, bei denen der erste Test, der wahr ist, das zu evaluierende Formular verursacht.
%Vor%Hier ist dein erster
%Vor% cond schaut auf (eq? x 0)
und stellt fest, dass es falsch ist. Die nächste Klausel ist (display "whatever\n")
. Es schaut auf display
, und da display
nicht nil
ist, ist es wahr. Es wertet dann die Zeichenfolge "whatever\n"
aus, die einfach zu sich selbst ausgewertet wird. Also ist der Wert des Cond dann "whatever\n"
.
Nun, hier ist dein zweiter:
%Vor% Hier ist der erste Test falsch, und es geht weiter zum zweiten, der else
ist und der als wahr ausgewertet wird. (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.")
Nun ist das folgende Formular (display "whatever\n")
. Das ist eine Funktion, die das Zeichenfolgenargument an die Konsole sendet und nichts zurückgibt, weil die Anzeige dies tut. In einem anderen Schema könnte es den Zeichenfolgenwert zurückgeben und es auch drucken. In diesem Fall würden Sie
In der Funktion foo
wertet die cond
-Anweisung display
als zu testende Bedingung aus. Da es tatsächlich ein Symbol namens display
gibt, wird es als wahr ausgewertet, daher wird "whatever\n"
dann als Ergebnis von (foo 2)
ausgewertet.