One nice way to generate secret values is:
(let-struct secret ()
(make-secret))
The only thing you can do with this value is recognized it as itself
with EQ? and likewise distinguish it from all other values.
Dave
Eli Barzilay wrote:
> On Feb 25, Gregory Woodhouse wrote:
>> On Feb 25, 2006, at 3:43 PM, Ryan Culpepper wrote:
>>>>> You aren't actually applying the continuation in the failure thunk
>> Well, here's a simple case
>>>> > (define x 4)
>> > (let ((y (call/cc (lambda (k) (k 0))))) (set! x 5))
>> > x
>> 5
>>>> I had expected that the body of let statement would not have been
>> executed, so x would still be 4. But I suppose it's a matter of
>> strictness.
>> Strictness has nothing to do with this. (Not much, at least...)
> You use `call/cc' to grab a continuation and immediately use that
> continuation, so the result of that whole thing is just 0. In
> general,
>> (call/cc (lambda (k) (k E)))
>> is just a fancy way of writing E.
>>> Back to your original problem, you don't need any kind of continuation
> if you wrap the whole call in a `with-handlers':
>> (define (hash-contains? t x)
> (with-handlers ([exn:fail:contract? (lambda (_) #f)])
> (hash-table-get t x)
> #t))
>> But you can also get away with no continuations and no handlers -- you
> only need a unique identifiable value:
>> (define hash-contains?
> (let ([secret (list 'whatever)])
> (lambda (t x)
> (not (eq? secret (hash-table-get t x (lambda () secret)))))))
>