[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: eval questions
| Date: Tue, 27 Jan 1998 12:33:15 -0500 (EST)
| From: "R. Kent Dybvig" <email@example.com>
| Subject: eval questions
| I have a few questions about this:
| 1. May/must the environment contain bindings for variables that name
| optional procedures, such as transcript-on and sin? If not, what exactly
| is the set of bindings specified in the corresponding report? My guess
| is that the intent is for the environment to contain all required bindings
| and some subset of the optional bindings, but the word "exact" here
| is inappropriate.
You are right that the word "exact" is inappropriate. The intent was
to include all the required and a (possibly empty) subset of the
optional variables appearing in the report. The intent was that a
code generator generating code for report N would be able to run its
code in the corresponding environment.
| 2a. Can the environment contain bindings for identifiers not present in
| the report? The word "exact" notwithstanding, I believe that the answer
| to this question is yes. Say the environment contains a binding for the
| variable foo to a location containing the value 3. Since it is an error
| to reference an unbound variable, but an implementation is not required
| to signal the error, we can simply claim that foo is not bound. So what
| if erroneous references to foo happen to return 3? So what if erroneous
| references to foo return 4 after an erroneous assignment of foo to 4?
My intent when I wrote the proposal was that it should NOT be allowed.
I agree with you that the issue can be mooted when thinking about past
and current reports which have only indirect ways of finding out
whether a variable is bound and/or assigned. However, if the
mechanism is to be uniformly useful for future reports that may
contain error handling, the behavior would be different whether such a
variable was bound/assigned or not.
The issue becomes more complicated if we do things such as
(eval 'foo (scheme-report-environment 3))
where the code evaluated in the report's environment need not know
about error handling but the surrounding code does.
I realize that we could define the problem away, but again, I think
that it is more natural (and was my intent) to disallow additional
| 2b. If the answer to Question 2a is indeed yes, what does the restriction
| that eval is not allowed to create new bindings in the environment
| associated with scheme-report-environment mean?
The restriction was intended to make the environment handle represent an
| 2c. Again, if the answer to Question 2a is yes, can I not simply define
| scheme-report-environment as follows:
| (define scheme-report-environment
| (lambda (v)
| (if (eq? v 5)
| (error ...))))
| assuming that the environment specified by the value returned by
| interaction-environment contains a superset of the bindings listed
| in R5RS?
Again, this would violate the intent of the original proposal.
| 3. Suppose an implementation conforms to R5RS but supports version=3.
| Must (eval '(eqv? "" "") 3) return #t, as required in R3RS? Must
| (eval '(if '() 'yes 'no) 3) return no, as required in R3RS? Looking
| forward, if we alter the semantics of some required procedure for R6RS,
| e.g., eval(!), must a conforming R6RS implementation support the R5RS
| semantics if it allows version=5?
Absolutely. Otherwise it would not be an R3RS environment.
| I have similar questions about null-environment.
The intent of null-environment was to have only a minimal set of
special forms and no variable bindings at all. Its usefulness comes
from expressions such as
((eval '(lambda (+ - * =)
(if (= n 0)
(* n (fact (- n 1)))))))
my-+ my-- my-* my-=)
| I apologize for bringing these questions up at the last minute, but I
| am just now getting around to trying to implement this feature.
Better late than never.