On Sep 5, 2009, at 6:04 PM, Robby Findler wrote:
No. As we discussed, there can't be with this meaning of #:exists. If
there were, you'd run into the same problem as with number? (for those
that don't know what I'm talking about, see the new second gotcha
section in the contracts documentation in the guide).
But, if you want to protect yourself by shifting blame, you can still
do that. You need to use the 'stack' contract in your own code to do
so instead of using a predicate test.
So the client can write additional contracts involving stacks, e.g.,
[stack-append (-> stack stack stack)]
but it is impossible to write data definitions such as
A collection is one of:
-- stack
-- queue
and then use it because you can't distinguish a stack from a queue.
(Of course, if both stacks and queues support the same operations, you
can do this.)
-- Matthias
Robby
On Sat, Sep 5, 2009 at 10:02 AM, Matthias Felleisen<matth...@ccs.neu.edu
> wrote:
Is there a stack? predicate afterwards?
On Sep 4, 2009, at 2:00 PM, Robby Findler wrote:
I've added #:exists to provide/contract, as a way to hide
information
ala "type t" declarations on ML signatures.
See the contracts section in the Guide for a worked example and a
discussion of a gotcha. The short version is that you can now write
things like this:
(provide/contract
#:exists stack
[new stack]
[push (-> int stack stack)]
[pop (-> (and/c stack non-empty?) int)]
[non-empty? (-> stack boolean?)])
and have the contract system enforce data abstraction, even if your
stack operations are simply these:
(define new '())
(define push cons)
(define pop car)
(define non-empty? pair?)
That is, clients of your module will not be able to treat your
stacks
as if they were lists, even though they really are lists.
Robby
_________________________________________________
For list-related administrative tasks:
http://list.cs.brown.edu/mailman/listinfo/plt-dev
_________________________________________________
For list-related administrative tasks:
http://list.cs.brown.edu/mailman/listinfo/plt-dev