2009-07-17 9 views
16

Ich hatte eine ziemlich einfache Anforderung in meinem Scheme-Programm, mehr als eine Anweisung auszuführen, in der wahren Bedingung eines 'if'. . Also schreibe ich meinen Code, so etwas wie diese:Über "If .." in Scheme (Plt-Schema)

(if (= 1 1) 
((expression1) (expression2)) ; these 2 expressions are to be 
           ; executed when the condition is true 
    (expression3)) 

Offensichtlich ist, dass die oben nicht funktioniert, da ich unbeabsichtigt ein # Verfahren mit # Argumenten erstellt. Also, um meine Arbeit erledigt zu bekommen, lege ich einfach die obigen Ausdrücke in eine neue Funktion und rufe es von dort, anstelle von expression1, expression2. Es funktioniert funktioniert.

Also, mein Punkt hier ist: Gibt es ein anderes bedingtes Konstrukt, das meine Anforderung hier unterstützen kann?

Antwort

22

In MIT-Schema, das nicht sehr verschieden ist, können Sie begin:

(if (= 1 1) 
    (begin expression1 expression2) 
    expression3) 

Nutzen Cond:

(cond ((= 1 1) expression1 expression2) 
     (else expression3)) 
+0

Beachten Sie, dass der zweite Ausdruck ist wirklich die gleiche wie die erste: die (cond ...) functi on hat eine implizite (begin ...) innerhalb jeder Bedingung, die es überprüft, also sind sie offensichtlich gleich. –

1

Sie können COND verwenden, oder legen Sie die Ausdrücke in etwas wie PROGN in Lisp (ich bin nicht sicher, wie es in PLT Scheme heißt. edit: es heißt BEGIN).

COND wie folgt aussieht in Schema:

(cond [(= 1 1) 
     (expression1) 
     (expression2)] 
     [else 
     (expression3)]) 
1

Sie können (beginnen ...), um zu bekommen, was Sie im wahren Zweig Ihrer if-Anweisung wollen. Siehe here

2

(begin ...) ist, wie Sie mehrere Ausdrücke auswerten und die letzte zurückgeben. Viele andere Konstrukte fungieren als "implizite" begin Blöcke (sie erlauben mehrere Ausdrücke genau wie ein begin Block, aber Sie müssen nicht sagen begin), wie der Körper einer cond Klausel, der Körper einer für Funktionen, der Körper von a lambda, der Körper einer let, etc .; Sie haben es vielleicht benutzt, ohne es zu merken. Aber für if ist das in der Syntax nicht möglich, weil es zwei Ausdrücke (den einen für wahr und den anderen für falsch) nebeneinander gibt, und das Zulassen mehrerer Ausdrücke würde es mehrdeutig machen. Sie müssen also ein explizites begin Konstrukt verwenden.

0

Mit einer if Aussage mit mehr als zwei Fälle beinhaltet nisten, zB:

(if (test-1)    ; "if" 
    (expression-1) 
    (if (test-2)   ; "else-if" 
     (expression-2) 
     (expression-3))) ; "else" 

Mit cond die bevorzugte Art und Weise zum Ausdruck bedingte Anweisungen zu sein scheint, da es einfacher ist als ein Bündel lesen von verschachtelten if s und Sie können auch mehrere Anweisungen ausführen, ohne die begin Klausel verwenden:

(cond ((test-1) 
     (expression-1)) 
     ((test-2) 
     (expression-2) 
     (expression-3)) 
     (else 
     (default-expression)))