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)))