[plt-scheme] low-level contract constructors

From: Robby Findler (robby at cs.uchicago.edu)
Date: Tue Sep 9 09:30:55 EDT 2008

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)


Posted on the users mailing list.