[plt-scheme] Checking to see if a key is present in a hash table

From: Dave Herman (dherman at ccs.neu.edu)
Date: Sun Feb 26 00:35:42 EST 2006

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)))))))
> 



Posted on the users mailing list.