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

Reply via email to