You can use `module+` to automatically create a submodule that invokes your contracts, while the main module ignores them.
Then if you want speed, you can import your module as (require module-name) or if you want safety, you can import as (require (submod module-name safe)) Here's how I did it: https://github.com/mbutterick/txexpr/blob/master/main.rkt On Jun 3, 2014, at 12:28 PM, Roman Klochkov <kalimeh...@mail.ru> wrote: > On the other side of the question: > one may simply make something like > > (module lib/unsafe racket/base > (provide foo bar baz) > ...) > > (module lib racket/base > (require lib/unsafe) > (provide/contract > (foo (-> integer? any)) > (bar (-> list? list?))) > > (module lib/debug racket/base > (require lib/unsafe lib/checks) > (provide/contract > (foo (->i [x integer?] [result (complicated-check? result])) > (bar (-> sorted-integer-list? sorted-integer-list?))) > > To debug simply use */debug, and for max speed */unsafe... I need to think > about it. > > > > Tue, 3 Jun 2014 13:58:59 -0400 от Jay McCarthy <jay.mccar...@gmail.com>: > Roman, > > This approach is unlikely to work out due to separate compilation. Module A > can't really affect how module B gets compiled. Your contract-mode appears to > be trying to do such a thing. > > So it is not clear where the decision on compile mode is made. If it is > inside a module, then why not turn them off to remove contracts that enforce > things like security? > > Something like this seems to be "outside" of the language. I have thought > that the right place would be inside the compiler or something like the > demodularizer. Further, I imagine a general mechanism that turns > > (if p e (error ...)) > > into just > > e > > Instead of baked-in cooperation with and knowledge of contracts. > > Jay > > Sent from my iPhone > > On Jun 3, 2014, at 1:16 PM, Roman Klochkov <kalimeh...@mail.ru> wrote: > >> Will you accept patch for this, if I'll write it? >> >> (contract-out ...) will have (id debug-contract-expr >> production-contract-expr) instead of (id contract-expr) in syntax >> There will be global phase-1 variable >> contract-mode : (or/c 'nothing 'production 'pre 'pre-and-past 'all) = 'all >> >> nothing -- no checks >> production -- use production contract if present, otherwise check only >> pre-condiction >> pre -- check only pre-condiction >> pre-and-post -- check pre and post conditions >> all -- current behavior >> >> >> >> >> Tue, 3 Jun 2014 12:47:18 -0400 от Matthias Felleisen <matth...@ccs.neu.edu>: >> >> Your mail calls for a philosophical answer. If this were Eiffel, you would >> be correct. >> >> But Racket is not Eiffel: >> -- we are not a tools company that sells a language >> -- we spent our own time on a maintenance effort that goes above and beyond >> our jobs >> -- and we don't provide a standard language (meant to make developers happy >> and its creators famous and wealthy). >> >> Racket is a programming language programming language [not a typo]. We wish >> to go beyond conventional features. When it comes to contracts, this means >> we wish to provide (1) higher-order contracts so that we cover the full >> spectrum of linguistic features and (2) a programmable toolbox so that >> programmers can create their own favorite idioms -- above and beyond the >> stuff available in standard languages. >> >> We fully understand that expanding the horizons of the language puts some >> burden on programmers. Every programmer may have to develop his own >> techniques and tools and idioms for our new features. We balance this burden >> with a catalog-driven on-line library, where programmers can register little >> more than a github URL to share such libraries. >> >> With apologies for the extra burden and the non-technical answer -- Matthias >> >> >> >> >> >> >> >> On Jun 3, 2014, at 12:24 PM, Roman Klochkov <kalimeh...@mail.ru> wrote: >> >> > There should be _standard_ check-modes. With global variable (or better >> > compile-mode). >> > >> > Because, I can in my own libraries make this 4 or even more modes. But I >> > use 3d-party or standard library. And I cannot rewrite them all to my 4 >> > modes. >> > Even if another developer will use the same idea, he or she will have own >> > modes and own variable to set them. >> > >> > >> > Tue, 3 Jun 2014 07:47:37 -0400 от Matthias Felleisen >> > <matth...@ccs.neu.edu>: >> > >> > You can program these scenarios with option contracts; see comparison in >> > paper. Perhaps it's time to write this up as a chapter for the Guide. >> > >> > >> > On Jun 3, 2014, at 12:38 AM, Daniel Prager wrote: >> > >> >> > I propose something like two contracts: for debug and production modes. >> >> >> >> Eiffel compilers implement a sliding scale of contract-checking, >> >> something like: >> >> • Check nothing [naive] >> >> • Check pre-conditions only [good for production - quick] >> >> • Check pre- and post-conditions only [can be slow] >> >> • Check pre- and post-conditions and invariants [van be very slow] >> >> [Loop and ad hoc assertions would have been in there too.] >> >> >> >> Post-conditions and invariants can be *very* expensive to check, but are >> >> great when debugging. >> >> >> >> Pre-condition checking is typically cheap, and quickly tells you when >> >> trusted code is being called with bad arguments. >> >> >> >> Recommeneded development practice was to start with all contracts >> >> checked, and as one's code iterated towards trustworthiness turn down the >> >> checking-level (but leave pre-conduitions on) and enjoy the huge speed >> >> boost. >> >> >> >> There's value in being able to control checking on a per module basis, >> >> essentially doing deep checks on newer / less-tested / less-trusted parts >> >> of the system. >> >> >> >> How does the picture change with higher-order contracts and checking at >> >> module boundaries? >> >> >> >> Dan >> >> >> >> >> >> >> >> On Tue, Jun 3, 2014 at 6:20 AM, Roman Klochkov <kalimeh...@mail.ru> wrote: >> >> The problem is that, when debbugging, contract should be precise. For >> >> example, insert-in-sorted-queue may check that queue is orted before and >> >> after the function. >> >> But inserting the element is O(log n) and testing will be O(n). >> >> >> >> option contracts -- 1) unstable 2) should be turned off and on >> >> individually. >> >> >> >> For quick hack, I'll simply redefine contract-out and recompile all. But >> >> I propose something like two contracts: for debug and production modes. >> >> >> >> >> >> Mon, 2 Jun 2014 15:49:05 -0400 от Matthias Felleisen >> >> <matth...@ccs.neu.edu>: >> >> >> >> >> >> On Jun 2, 2014, at 3:42 PM, Roman Klochkov <kalimeh...@mail.ru> wrote: >> >> >> >> > Is there a way to disable all contract checks? >> >> > >> >> > Suppose, I debugged my program and sure that it is reliable. I disable >> >> > debugging, but as I understand, contracts are still checked in every >> >> > function. >> >> > But I want to maximize the performance of my program. Is there a way to >> >> > do that or I have to manually hack racket/contract/base to do that? >> >> >> >> >> >> No. >> >> >> >> ;; --- >> >> >> >> Programmers who disable assertion checking as they are deploying software >> >> are like people who wear life vests on land when they learn about the >> >> theory of sailing and take them off as soon as they board the boat for >> >> practical exercises on the water. -- somebody famous >> >> >> >> ;; --- >> >> >> >> You will need to define a version of provide and/or contract-out that >> >> throws away contracts based on a switch. >> >> >> >> Or you check out option contracts and use those. >> >> >> >> -- Matthias >> >> >> >> >> >> >> >> -- >> >> Roman Klochkov >> >> >> >> ____________________ >> >> Racket Users list: >> >> http://lists.racket-lang.org/users >> >> >> >> >> >> >> >> >> >> -- >> >> Daniel Prager >> >> Agile/Lean Coaching, Software Development and Leadership >> >> Startup: www.youpatch.com >> >> Twitter: @agilejitsu >> >> Blog: agile-jitsu.blogspot.com >> > >> > >> > >> > -- >> > Roman Klochkov >> >> >> >> -- >> Roman Klochkov >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users > > > -- > Roman Klochkov > ____________________ > Racket Users list: > http://lists.racket-lang.org/users
____________________ Racket Users list: http://lists.racket-lang.org/users