The first presumes that the environments (namespaces) returned by scheme-report-environment are mutable, which is not required by the R5RS standard. An advantage of this fileVal is that the user and the resulting modules can not interfere with each other via a shared top level namespace. Vandalism such as (set! car 0) or (define cdr car) impacts only the guilty module.
The second creates no new environments and evaluates the text of the modules in the caller’s environment. This means that:
It is easy to create another fileVal that provides an environment that lacks the file primitives so as to keep untrusted modules from writing your file system. In that case you could pass as a parameter to the yielded function what-ever weakened primitives you wished.
(let ((ns (scheme-report-environment 5))) (eval '(define v 3) ns) (eval 'v ns))should yield 3 if scheme-report-environment makes namespaces that can be expanded to include new names. If this fails then the first version of fileVal will fail.
If
(eval 3) ; => 3fails then the second version will fail.
Just now after (use numbers) the two expressions:
(eval '(- 3 1) (scheme-report-environment 5)) ; => 2 ((eval '- (scheme-report-environment 5)) 4 2) ; => 2both fail in Chicken Scheme after the numbers package has been added and this makes both versions of fileVal fail.