[plt-scheme] low-level contract constructors
Great, thanks for the (incredibly) quick response!
Thanks,
Dave
Robby Findler wrote:
> On Tue, Sep 9, 2008 at 8:23 AM, Dave Herman <dherman at ccs.neu.edu> wrote:
>> In parameter.plt I have a struct-as-procedure called a pseudo-parameter with
>> a high-order contract constructor pseudo-parameter/c. I discovered a couple
>> little issues with the scheme/contract library in the process.
>>
>> - The undocumented `proj-get' procedure seems necessary for a higher-order
>> contract constructor, since you need to use the projection of the underlying
>> contract in building the new one.
>>
>> - The `flat-proj' procedure isn't exported from scheme/contract, but it's
>> also needed for a higher-order contract, in case the underlying contract is
>> flat. So I copied its definition from contract-guts.ss and pasted it into my
>> module.
>
> I have not spent the time to properly document and export the tools to
> build new contract combinators (partly because they have changed a
> bunch and partly because I just haven't gotten to it).
>
>> Robby, if by chance you have a moment, could you take a look at
>>
>> http://planet.plt-scheme.org/package-source/dherman/parameter.plt/1/3/main.ss
>>
>> and tell me if pseudo-parameter/c looks plausible?
>
> It seems fine on a quick look.
>
>> It seems to work for the
>> test cases I've tried, but it's a little confusing so I'm not sure I've got
>> it right. Particularly the call to ((proj-get c) c) looks weird.
>
> That's fine.
>
>> Also, I
>> seem to be getting the object-name wrong when wrapping a function contract,
>> e.g.:
>>
>> (module a scheme
>> (require (planet dherman/parameter:1:3))
>> (define p
>> (let ([f add1])
>> (make-pseudo-parameter
>> (lambda () f)
>> (lambda (g)
>> (set! f g)))))
>> (provide/contract [p (pseudo-parameter/c (-> number? number?))]))
>>
>> > (require 'a)
>> > (p)
>> #<procedure:unsaved-editor4117:9:47>
>
> I don't think you can do much better. You're making a wrapper
> function, so you're going to have that wrapper function's name, not
> the name `add1'. The same thing happens like this:
>
> #lang scheme/load
>
> (module m scheme
> (provide/contract [f (-> (-> number? number?))])
> (define (f) add1))
>
> (module n scheme
> (require 'm)
> (printf "~s\n" (f)))
>
> (require 'n)
>
> Robby