[racket-dev] contract-out

From: J. Ian Johnson (ianj at ccs.neu.edu)
Date: Sun Sep 25 10:55:23 EDT 2011

Very nice! Is it easy to make a provide form that conditionally provides with contracts, such as Sam's provide-cond-contract in typed-scheme/utils/utils.rkt?
-Ian
----- Original Message -----
From: Matthew Flatt <mflatt at cs.utah.edu>
To: dev at racket-lang.org
Sent: Sat, 24 Sep 2011 09:41:17 -0400 (EDT)
Subject: [racket-dev] contract-out

The `racket/contract' and `racket' modules now provide `contract-out',
which is a `provide' form for contracts. Use

    (provide (contract-out ....))

instead of

    (provide/contract ....)


There's one difference between `(provide (contract-out ....))' and
`(provide/contract ....)': contract expressions in contract-out' are
implicitly moved to the end of the module, which means that they can
refer to variables that are defined later. For example, the following
program works as you'd expect:

 #lang racket
 
 (provide (contract-out [mask-of (turtle? . -> . color?)])
          turtle?
          color?)

 (define (turtle? v)
   (memq v '(Leonardo Michelangelo Donatello Raphael)))
 (define (color? v)
   (memq v '(blue orange purple red)))

 (define (mask-of t)
   (match t
     ['Leonardo 'blue]
     ['Michelangelo 'orange]
     ['Donatello 'purple]
     ['Raphael 'red]))


The `contract-out' form is implemented as a provide pre-transformer,
which is a new kind of `provide' form that is now supported by
`racket/provide-transform'.

_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev



Posted on the dev mailing list.