[plt-scheme] web server contracts
At Fri, 27 Feb 2004 10:12:29 -0500, David Van Horn wrote:
> For list-related administrative tasks:
> http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>
> I am having trouble using contracts with the web server:
>
> (define/contract start
> (request? . -> . response?)
> (lambda (initial-request)
> `(html (body (p "response"))))))
>
You probably mean to use provide/contract, not define/contract here
(but this is unrelated to the problem below).
> Servlet didn't load. dynamic-require: name is provided as syntax: start by
> module: |,/local/riverbot/www/servlets/contract-test|
>
> Am I misusing contracts, or is this a bug?
You cannot use dynamic require with a contracted export. Contracts need
to know (statically) the module that is using the contracted variable,
since it is a candidate for blame. dynamic-require does not transmit
this information, so it cannot be used.
You can kind of work around this like this:
(module m mzscheme
(provide/contract [f (integer? . -> . integer?)])
(define (f x) (+ (* x x) 1)))
(module n mzscheme
(require m)
(provide f2)
(define f f2))
(probably even using `rename' for something slightly better).
Of course, in this case, `n' will be blamed if `f' is supplied a
non-integer, which may or may not be what you want.
hth,
Robby