[racket] obtaining the location of an identifier

From: Emina Torlak (emina at eecs.berkeley.edu)
Date: Mon Nov 18 14:43:44 EST 2013

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>

Posted on the users mailing list.