2016-03-29 15 views

Antwort

5

Ja. Sie wollen abhängige Verträge, in Racket ausgedrückt mit dem ->i Vertrag Kombinator verwenden. Der Vertrag für die Funktion, wie Sie es wie folgt aussehen:

(->i ([x (and/c integer? positive?)] 
     [y (x) (and/c integer? positive? (<=/c x))]) 
    [result any/c]) 

Hier ein Beispiel für die Art von Fehler ist, die auftreten würden, wenn fälschlicherweise die Funktion mit dem oben genannten Vertrag unter Vertrag Anwendung:

> (func 1 2) 
func: contract violation 
    expected: (and/c integer? positive? (<=/c 1)) 
    given: 2 
    in: the y argument of 
     (->i 
     ((x (and/c integer? positive?)) 
     (y 
     (x) 
     (and/c integer? positive? (<=/c x)))) 
     (result any/c)) 
    contract from: (function func) 

Für abhängige Verträge müssen alle Argumente und das Ergebnis benannt werden, damit sie in anderen Klauseln verwendet werden können. Die (x) innerhalb der zweiten Argumentklausel gibt an, dass der Vertrag für yvon den Wert x abhängt, so dass Sie x innerhalb der Vertragsspezifikation für y verwenden können.

Die vollständige Grammatik für ->i ist verfügbar in the documentation, die viele zusätzliche Funktionen hat. Es hat auch einige Beispiele, einschließlich eines, das dem Beispiel in Ihrer Frage sehr ähnlich ist.