To add a bit to what Alexis said about flat contracts:

On Wed, May 22, 2019 at 1:23 PM Alexis King <[email protected]> wrote:

> Your intuition is right, but let me make it more precise: foo? is used
> when something is a flat contract, and foo/c is used otherwise. Flat
> contracts only check *first order properties* of values, which is a
> technical term that captures what you mean by “general nature.”
>
> The important distinction is that first order properties can be checked
> immediately … Since flat contracts only perform first-order checks, a flat
> contract can be used as a predicate, so you can write (foo? x) to get back
> a boolean. Likewise, all predicates can be used as flat contracts.
>

Some flat contracts use the foo/c naming convention when they include
special error reporting, which can potentially involve a performance cost
beyond a simple predicate. For example, the `xml` module provides both
`xexpr?` and `xexpr/c`:
https://docs.racket-lang.org/xml/index.html#(def._((lib._xml%2Fprivate%2Fxexpr-core..rkt)._xexpr%2Fc))
I write a lot of these kinds of contracts, and I think they're very
effective. In my RacketCon talk last year, I discussed using contracts to
do XML validation and produce error messages good enough for
non-programmers to fix invalid XML files:
https://youtu.be/pv0lLciMI24?t=5479

-Philip

-- 
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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/CAH3z3gYGGmxaNGJgVFG8y%3Dum2whn-LBj9-Q2vOHeem_cvANzAg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to