On Tue, Sep 4, 2018 at 8:55 PM, Matthew Butterick <[email protected]> wrote:

>
> On Sep 4, 2018, at 3:54 PM, David Storrs <[email protected]> wrote:
>
> Say I have this (possibly from a third-party module):
>
>   (define/contract (foo arg) (-> string? #t) #t)
>
> I want to ensure that the argument is always non-empty, so I tighten the
> contract.  I could do this:
>
>   (set! foo (contract (-> non-empty-string? #t) foo 'foo 'neg))
>
> Mutating the function is pretty ugly, but I'm not sure of a better way.
>
>
>
> Seems like this technique would break down with imported identifiers, for
> instance:
>
> ;;;;;;;;;;;;;;;;;;;;;
>
> #lang racket
>
> (module foomod racket
>   (provide foo)
>   (define/contract (foo arg) (-> string? #t) #t))
> (require 'foomod)
>
> (set! foo (contract (-> non-empty-string? #t) foo 'foo 'neg))
>
> (foo "") ; error: set!: cannot mutate module-required identifier in: foo
>
>
>
>
Ah, good point.  I'd realized that the tighter version would be visible
only in the current module, but I hadn't noticed that you actually can't
mutate imports.  Thanks.


> I am left with the following questions:
>
> 1) Is there a better way to do this?
>
>
> Why not the old prefix-and-wrap?
>
> ;;;;;;;;;;;;;;;;;;;;;
>
> #lang racket
>
> (module foomod racket
>   (provide foo)
>   (define/contract (foo arg) (-> string? #t) #t))
> (require (prefix-in lax: 'foomod))
>
> (define foo (contract (-> non-empty-string? #t) lax:foo 'foo 'neg))
>
> (foo "")
>
>
That works.


>
> 2) If I use this method in a module other than the one where foo was
> defined, my expectation is that I would affect it only in the current
> module but that other importers would not see the change.  Is this right?
>
>
> When you export this new `foo`, it carries the new contract, of course.
> (The old one remains but because your wrapper contract is tighter, any
> contract blame will happen in the new contract)
>

Great, thanks.  This does exactly what I need.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to