Thu Aug 6 15:01:19 CEST 2009
Looks like I'm confusing two things:
* primitive values + fully reduced closures (lambda + env)
* non-fully reduced closures (application/varref/value + env)
I'd like to make sure that primitives only see primitive values and
fully reduced closures. Also, primitives should be able to return
closures (even not fully reduced).
Where is the inconsistency?
Looking at PLLC Chapter 6, p 74 at the CEK reduction rule [cek5], it
seems that primitives get passed _only_ primitive values, not
How can I make this consistent with a primitive that can operate on
closures as values?
Hmm.. Let's provide better names for the data structure.
1. A continuation frame represents the current state of argument
evaluation from reducable closures to irreducable closures.
2. A fully evaluated continuation frame can be _applied_ which means
that a new (reducable) closure is created by extending the closure
in the first position with variables.
From what I could test it seems that application works fine. So I
guess I need to figure out how to understand the difference between:
- a machine where _all_ values are closures, but primitives can
only accept and return primitive values (which have their
environment dropped before primitive evaluation)
- a machine where values are either closures or primitive
values, and primitive functions can operate on both.
So, either the interpreter's notion of "closure" is made abstract, or
it is changed to directly operate on both primitive values and
What I could do is the following: regard interpreter state and
environment + data structures as different worlds.
STATE: the current reducable closure and continuation contain closure
structs only, but all communucation with the environment (extension
and reference) and primtives will pack/unpack closures to variables.
Ok. Added closure_pack() and closure_unpack().