2017-04-20 3 views
1

Ich habe Probleme, das Konzept zu verstehen, wie man eine mehrfache Bedingung wenn Aussage im Schema richtig bildet. Ein Beispiel wäre so etwas wieMehrere Bedingungen in Schema

if(a>b && b<c){ action; }

In den meisten Programmiersprachen i vertraut bin mit, aber das ist eine gewaltige Aufgabe in Schema beweisen.

(define (my-list-ref lst) 
    (cond (and((>(car lst)0) (<(cadr lst)0)) 
      ((+ n 1)(my-list-ref (cdr list))) 
      (and((<(car lst)0) (>(cadr lst)0))) 
      (zero? car lst) 
      (my-list-ref(cdr lst)) 
      (null? lst) 
      (display n)))) 

Mit den ersten Zeilen des cond Code i, dass, wenn das Auto von der Liste zu sagen versuche ist größer als 0, und die CADR kleiner als 0 ist, möchte ich es eine gewisse Maßnahmen ergreifen, noch Ich werde mit einem schlechten Syntaxfehler für den Operator und begrüßt. Ich bin zutiefst verwirrt, würde eine Erklärung sehr schätzen.

Antwort

2

Die Syntax von cond funktioniert wie folgt:

(cond 
    [question1 expression1] 
    [question2 expression2] 
    [question3 expression3] 
    [else  expression4]) 

Bitte beachte, dass ich eckige Klammern verwenden. In Schema bedeuten eckige Klammern und normale Klammern dasselbe. Es ist einfach, die Gruppierung zu sehen, wenn eckige Klammern verwendet werden. so etwas wie dieses

Ihr Beispiel wird:

(define (my-list-ref lst) 
    (cond 
    [(and (> (car lst) 0) (< (cadr lst) 0)) (my-list-ref (cdr list))] 
    [(and (< (car lst) 0) (> (cadr lst) 0)) some-action-here] 
    [(zero? car lst)       (my-list-ref(cdr lst))])) 

Hinweis hier, dass die Syntax von and funktioniert wie folgt:

(and expression1 expression2) 

Also, wenn Sie überprüfen möchten, ob (> (car lst) 0) und (< (cadr lst) 0) in der gleichen Art, Die Cond-Frage wird (and (> (car lst) 0) (< (cadr lst) 0)).

+0

Danke, aus irgendeinem Grund habe ich viele Beispiele mit() statt eckigen Klammern [] gesehen. – user2738052

+0

Klammern und eckige Klammern sind in Racket äquivalent; Verwenden Sie sie, um visuellen Kontrast zu bieten. –