Next: dynamic environment extent, Previous: dynamic environment intro, Up: dynamic environment [Index]
Parameters are the perfect example of using the dynamic environment to define a state that is “local” to the dynamic extent of a function call; iklib parameters, for details.
The following example shows how in a call:
(with-exception-handler ?handler ?thunk)
the ?handler is called in the dynamic environment of the call to ?thunk, so that it can access the dynamic environment that contributed to cause the exception:
(import (vicare))
(define parm
(make-parameter #f))
(parametrise ((parm 'outer-parm))
(with-exception-handler
(lambda (E)
(parm))
(lambda ()
(parametrise ((parm 'inner-parm))
(raise-continuable 2)))))
⇒ inner-parm
The following example shows how parametrise causes the value of
the parameter to be “local” to a coroutine:
#!vicare
(import (vicare)
(only (vicare checks)
with-result
add-result))
(define-syntax dotimes
(syntax-rules ()
((_ ?count . ?body)
(do ((i 0 (+ 1 i)))
((= i ?count))
. ?body))
))
(define parm
(make-parameter #f))
(define (doit name init)
(parametrise ((parm init))
(coroutine
(lambda ()
(dotimes 5
(add-result (list name (parm)))
(parm (++ (parm)))
(yield))))))
(with-result
(doit 'one 0)
(doit 'two 10)
(finish-coroutines)
1)
⇒ (1 ((one 0) (two 10)
(one 1) (two 11)
(one 2) (two 12)
(one 3) (two 13)
(one 4) (two 14)))