问题
I am confused about eval
. I looked at the specification of eval
in schemers.org. It says
procedure: (eval expression environment-specifier)
It indicates to me that environment-specifier
is mandatory requirement. However, when I tested eval
using two interpreters -- the one at repl.it and Elk Scheme -- both of them work without environment-specifier
. My question is: Are they both non-conformant interpreters or did I read the documentation at schmers.org wrong?
And then..
Elk Scheme has no problem evaluating (eval 5)
and (eval (list + 5 6))
but the Scheme interpreter at repl.it is not able to evaluate them. The later will evaluate (eval `(+ 5 6))
fine but not the first two expressions. My question is: Is the behavior of the repl.it interpreter conformant?
How do other Scheme interpreters deal with the first two expressions?
回答1:
The Scheme report is what you need to follow to write compatible programs. Other than that the implementations themselves can have their own syntax and procedures and it won't interfere since a standard conforming program wouldn't use them. Not all Scheme reports had eval
mandatory so you need to find out which report it should conform to and if it needs some switch to follow the standard. eg. ikarus needs --r6rs-script
as a switch to run R6RS programs correctly. I think Elk
is R4RS so eval
is not specified in that report and BiwaScheme seems to have references to R6RS in it's source so it should take a second argument. that it works is no proof it's conformant so you should dig a little in their documentation.
Also, everything defined as undefined in the report you might actually choose something and it's still according to report. E.g. I've seen define
return the object that was bound and all the !
procedures return the object it mutated and it's all according to the report since any value is equal to the reports undefined value.
Also, very few errors in the report actually demands a error being signaled. Since it's not mandatory to signal errors its up to the developer to make sure they do not do anything that is considered an error. The implementations can actually return something like a incredibly wrong value, crash or if it's a nice implementation it signals an error. Any one of those are equally fine for the report. In fact this is one of them:
(define (test) "hello")
(string-set! (test) 0 #\H) ; might signal an error
(test) ; might evaluate to "hello", "Hello"
In most Scheme implementations you won't get any error and it will probably make test
return "Hello"
. The report states this specifically to be an error so I guess it means you should never make a program like this to any Scheme interpreter since the outcome is undefined.
来源:https://stackoverflow.com/questions/22595360/seeking-clarification-on-scheme-eval