Was passiert in einer Scheme 'cond' Klausel, wenn 'else' weggelassen wird?

8

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%     
Leonard 01.05.2009, 22:37
quelle

2 Antworten

16

"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

sehen %Vor%     
Charlie Martin 01.05.2009, 22:52
quelle
9

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.

    
Greg Hewgill 01.05.2009 22:43
quelle

Tags und Links