environment-set!
[Kon Lovett]environment-copy
symbol filtering, extended interaction-environment
support, added environment-symbols
[Kon Lovett]environment-has-binding?
[reported by Mario Domenech Goulart]environment-for-each
environment-includes?
with the interaction-environment, added environment-mutable?
and environment-extendable?
(require-extension environments)
This extension provides procedures for creating and manipulating evaluation environments. An extension of the eval unit's procedures.
An evaluation environment can be passed as the second argument to the
eval
procedure.
Environments can optionally be extendable (evaluated code may create new bindings), and selected variables may be mutable or immutable.
The (interaction-environment)
is a special case. All symbols
are mutable but the environment itself is not mutable.
These environments do not handle syntactic keywords, only normal global variables; i.e. No Macros!
[procedure] (environment? X)
#t
if X
is an environment, or
#f
otherwise.[procedure] (environment-copy ENV [FLAG [SYMBOLS]])
ENV
. If the optional argument
FLAG
is given and true, then evaluated code can create new variable
bindings inside the newly created environment and bindings in the environment
may not be modified by evaluated code. If the optional argument
SYMBOLS
is given and is a list of symbols, then the environment
copy will only contain those symbols from the environment ENV
.[procedure] (environment-extendable? ENV)
#t
if the environment ENV
is extendable or
#f
otherwise.[procedure] (environment-extend! ENV SYMBOL [VALUE [MUTABLE]])
SYMBOL
in environment
ENV
. If the optional argument MUTABLE
is not given or
true, then the binding is mutable and can be changed by evaluating (set!
VARIABLE ...)
. The variable is initialized to VALUE
, or is
unbound, if VALUE
is not given. Creation of a new symbol in an
inextensible environment will succeed. Changing the value of an immutable
variable will succeed.[procedure] (environment-has-binding? ENV SYMBOL)
#t
when the variable SYMBOL
has a value in
environment ENV
, or #f
otherwise.[procedure] (environment-includes? ENV SYMBOL)
#t
if the environment has a binding for the variable
SYMBOL
, or #f
otherwise. When called with the value of
(interaction-environment)
then this procedure returns always
#t
.[procedure] (environment-ref ENV SYMBOL)
SYMBOL
in environment
ENV
. If the environment does not contain the variable, or if the
variable is not bound, an error is signaled.[procedure} (environment-remove! ENV SYMBOL [SILENT? #f])
SYMBOL
in environment
ENV
. SYMBOL
may also be a list of symbols. It is an
error to attempt to remove an undefined symbol, unless SILENT?
is
#t
.[procedure] (environment-set! ENV SYMBOL VALUE)
SYMBOL
in environment
ENV
to VALUE
. When the SYMBOL
does not
exist in environment ENV
the SYMBOL
is created with
VALUE
if ENV
is extensible, otherwise an error is
signaled. Changing the value of an immutable variable will succeed.[procedure] (environment-mutable? ENV SYMBOL)
#t
if the variable SYMBOL
in environment
ENV
is mutable or #f
otherwise.
[procedure] (environment-set-mutable! ENV SYMBOL FLAG)
SYMBOL
in environment ENV
mutable, if FLAG
is true, or immutable, if not. This procedure has
no effect when called with the value of (interaction-environment)
.[procedure] (make-environment [FLAG])
FLAG
is given and true, then evaluated code can create new bindings
inside this environment.[procedure] (environment-for-each ENV PROC)
PROC
with the name and value of each global binding in
the given environment.[procedure] (environment-symbols ENV)
; create an immutable environment with all R5RS procedures: (define my-env (environment-copy (scheme-report-environment 5) #f) ) (eval '(set! car 99) my-env) ;==> Error (eval '(define abc 100) my-env) ;==> Error (environment-extend! my-env 'abc 100) (eval 'abc my-env) ;==> 100 (eval '(set! abc 101) my-env) (eval 'abc my-env) ;==> 101 (environment-set-mutable! my-env 'abc #f) (eval '(set! abc #f) my-env) ;==> Error
Copyright (c) 2003, Felix L. Winkelmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.