Verwirrt über Racket-Verträge

8

Ich habe eine Funktion true? zur Verwendung mit Zähle im Schläger / in der Liste.

%Vor%

Ich bemerkte, dass ich numerische Argumente liefern konnte und meine Funktion würde gerne #f zurückgeben.

%Vor%

Also dachte ich mir, ich würde einen Racket-Vertrag verwenden, um nicht-boolesche Argumente einen Fehler bei der Vertragsverletzung zurückgeben zu lassen. Also lege ich diesen Code an den Anfang meiner Datei:

%Vor%

Nach dem Hinzufügen des Vertrags bekomme ich jedoch immer noch das gleiche Verhalten wie oben im Racket REPL. Ich verstehe nicht, wie das sein könnte. Was vermisse ich?

    
wdkrnls 05.02.2013, 22:35
quelle

2 Antworten

20

Verträge werden normalerweise zwischen Modulen erzwungen. Sie müssten es also von außen versuchen. Die REPL bezieht sich jedoch auf das Innere des Moduls, in dem Sie arbeiten.

Eine einfache Möglichkeit, von außen zu testen, ist die Verwendung eines Submodul testen . Zum Beispiel:

%Vor%

Ändern Sie die Verträge und führen Sie sie erneut in DrRacket aus, und Sie sollten Ihre Verträge hier sehen, da das Modul test hier als externer Kunde des Vertrags behandelt wird.

Alternativ können Sie auch eine andere Datei erstellen, die require s die erste ist, und dann können Sie dort auch die Auswirkungen von Verträgen sehen. Wenn die erste Datei true-test.rkt heißt, können Sie ein anderes Modul erstellen und dann:

%Vor%     
dyoo 05.02.2013, 23:02
quelle
13

Danny Yoo gab eine ausgezeichnete Antwort. Ich wollte es nur erweitern und feststellen, dass Racket Ihnen mehr Flexibilität gibt, wo Ihr Vertrag durchgesetzt wird (z. B. wo die Vertragsgrenze liegt). Beispielsweise können Sie das Formular define/contract verwenden:

%Vor%

, was eine Vertragsprüfung zwischen der Definition von true? und allen anderen Codes festlegt:

%Vor%

Ich finde define/contract besonders nützlich, wenn ich etwas im Zusammenhang mit Verträgen an der REPL testen möchte, wo ich nicht immer ein Modul habe. % Co_de% ist jedoch die Standardempfehlung, da das Überprüfen von Verträgen an Modulgrenzen normalerweise eine gute Wahl ist.

    
Asumu Takikawa 06.02.2013 06:53
quelle

Tags und Links