2016-05-05 12 views
2

ich eine Funktion haben, die im GrundeWie Schema cond zu schreiben, so dass es den Wert eines verschachtelten cond kehrt

(cond 
    (
    (cond) 
    (cond) 
    ) 
) 

Im Moment Schema erscheint mir wie eine Fremdsprache geht. Meine Frage ist einfach. Wie bekomme ich die erste Bedingung, die nur dann true zurückgibt, wenn die verschachtelten auch wahr zurückgegeben haben. Von dem, was ich gesammelt habe, wird das verschachtelte (cond) (cond) als der Test für das erste Recht behandelt? Alles, was ich bekomme, ist #void für eine Rückkehr.

Antwort

3

So:

(cond ((cond ((= 1 2) #f) 
      ((= 2 3) #f) 
      (else #f)) 
     #t) 
     ((cond ((= 3 4) #f) 
      ((= 4 5) #f) 
      (else #t)) ; this is the only #t condition 
     #t))    ; hence this #t value is returned 

In dem obigen Beispiel wird nur die letzte else in dem zweiten inneren cond true zurück, die abwechselnd in dem Zustand der äußersten cond true zurück.

Aber wirklich, warum möchten Sie so etwas tun? Wenn Sie mehrere Bedingungen haben, verwenden Sie einfach verschiedene Zweige einer einzelnen cond. Vielleicht missverstehen Sie, wie es verwendet werden soll? Betrachten Sie es als eine Reihe von if-else if-else if-else Anweisungen in anderen Programmiersprachen.

2

Es gibt keinen Grund, das zu tun. Stellen Sie sich folgendes Beispiel:

(cond ((cond ((< x 10) #t) 
      ((> x 20) #t) 
      (else #f)) 
     #t) 
     ((cond ((< y 10) #t) 
      ((> y 20) #t) 
      (else #f)) 
     #t)) 

Diese leicht cond einem werden kann flattended nach unten:

(cond ((< x 10) #t) 
     ((> x 20) #t) 
     ((< y 10) #t) 
     ((> y 20) #t) 
     (else #f)) 

Sie or verwenden könnte den ersten wahren Wert zu nehmen. Dies funktioniert für alle wahren Werte, nicht nur #t (Alles, was nicht #f ist wahr betrachtet)

(or (cond ((< x 10) 'small-x) 
      ((> x 20) 'big-x) 
      (else #f)) 
    (cond ((< y 10) 'small-y) 
      ((> y 20) 'big-y) 
      (else #f))) 

Auch wenn Sie cond für jede bedingte seine wahrscheinlich weise nur darauf verwenden, wo es entweder Nebenwirkungen beteiligt, oder es können sind mehr als ein Prädikat (wie zB in Algol-Sprachen) und verwenden if als Bedingung für ein Prädikat. Z.B. Sie können oben auf das eine der Teil cond s schreiben:

(cond ((>= 20 x 10) #f) 
     (else #t)) 

Jetzt habe ich automatisch cond-if geändert hätte, da es für eine cond nicht mehr nessecary ist:

(if (>= 20 x 10) 
    #f 
    #t) 

Vielleicht eine schlechte Beispiel, da das ganze if(not (>= 20 x 10)) geschrieben werden kann.