The dynamic extent of a procedure call is the time between when
it is initiated and when it returns. In Scheme,
call-with-current-continuation (see Control features) allows
reentering a dynamic extent after its procedure call has returned.
Thus, the dynamic extent of a call might not be a single, continuous
time period.
This section introduces parameter objects, which can be bound to new values for the duration of a dynamic extent. The set of all parameter bindings at a given time is called the dynamic environment.
(make-parameter init) ¶(make-parameter init converter) ¶Returns a newly allocated parameter object, which is a procedure that
accepts zero arguments and returns the value associated with the
parameter object. Initially, this value is the value of
(converter init), or init if the conversion
procedure converter is not specified. The associated value can be
temporarily changed using parameterize, which is described below.
The effect of passing arguments to a parameter object is implementation-dependent.
(parameterize ((⟨param1⟩ ⟨value1⟩) …)
⟨body⟩) ¶Syntax: Both ⟨param1⟩ and ⟨value1⟩ are expressions.
It is an error if the value of any ⟨param⟩ expression is not a parameter object.
Semantics: A parameterize expression is used to change the
values returned by specified parameter objects during the evaluation of
the body.
The ⟨param⟩ and ⟨value⟩ expressions are evaluated in an
unspecified order. The ⟨body⟩ is evaluated in a dynamic
environment in which calls to the parameters return the results of
passing the corresponding values to the conversion procedure specified
when the parameters were created. Then the previous values of the
parameters are restored without passing them to the conversion
procedure. The results of the last expression in the ⟨body⟩ are
returned as the results of the entire parameterize expression.
Note: If the conversion procedure is not idempotent, the results of ‘(parameterize ((x (x))) …)’, which appears to bind the parameter
xto its current value, might not be what the user expects.
If an implementation supports multiple threads of execution, then
parameterize must not change the associated values of any
parameters in any thread other than the current thread and threads
created inside ⟨body⟩.
Parameter objects can be used to specify configurable settings for a computation without the need to pass the value to every procedure in the call chain explicitly.
(define radix (make-parameter 10 (lambda (x) (if (and (exact-integer? x) (<= 2 x 16)) x (error "invalid radix"))))) (define (f n) (number->string n (radix))) (f 12) ⇒ "12" (parameterize ((radix 2)) (f 12)) ⇒ "1100" (f 12) ⇒ "12" (radix 16) ⇒ unspecified (parameterize ((radix 0)) (f 12)) ⇒ error