On 12/1/10 2:26 PM, YC wrote:
Hi all -
a question for those who have experiences with metacircular interpreters:
How do you represent the lexical variables? Since lexical variables can
be optimized away so they won't show up on a call to eval, it seems
putting them into the environment (I am using a struct holding an
immutable hash for environment) isn't the right approach. It feels like
I need my own call-stack to represent them, but that sounds "heavy" for
a metacircular interpreter.
Any thoughts are appreciated, thanks.
An evaluator can implement function application using substitution, i.e.
you can evaluate ((lambda (x) e) v) by evaluating the substitution of v
for x in e.
Or, you can be lazy and defer the substitution. In that case, you
evaluate ((lambda (x) e) v) by evaluating e; you just have to remember
that v should have been substituted for x should you ever get to
evaluating x. The data structure you use to remember those deferred
substitutions is an environment. A simple list of variable, value pairs
is a suitable representation.
You can read all of this and more in any decent PL book that covers
writing evaluators. See, e.g., chapters 3-5 of PLAI.
http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
David
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users