[racket] obtaining the location of an identifier
I'm using Racket to implement a language for which I need to track state
updates---in particular, variable mutation using set!. For example,
consider this module definition:
#lang racket
(require (only-in racket [set! #%set!]))
(define global (make-hash))
(define-syntax-rule (location-of id)
(#%variable-reference id)) ; doesn't quite do the right thing
(define-syntax-rule (set! id expr)
(let ([val expr])
(hash-set! global (location-of id) val)
(#%set! id val)))
When I evaluate the following sequence of forms against the above
definition, I would like the global hash map to contain just one binding
that maps the location for 'x' to the value 2. With the above
implementation I get two map entries, since variable-reference doesn't
quite do what I hoped it did:
> (define x 0)
> (set! x 1)
> (set! x 2)
> x
2
> global
'#hash((#<variable-reference> . 1) (#<variable-reference> . 2))
Is there another construct in Racket that I could use for this purpose? If
not, can something like this be implemented and how much work would it
entail?
I have a purely macro-based solution that works for the most part, but it's
fragile and there are corner cases for which it is just wrong. So, before
trying to fix that, I was wondering if there is a nicer way to solve it by
somehow getting handles for variable locations that are comparable using
eq? or equal?
Thanks!
Emina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20131118/eb71ea8f/attachment.html>