Some more examples; this one works fine:
scheme@(guile-user)> (define (with-captured-dynenv proc)
(let ((tag (make-prompt-tag "dynenv-capture")))
(call-with-prompt
tag
(lambda ()
(proc (lambda (thunk)
(abort-to-prompt tag thunk))))
(lambda (return thunk)
(return (thunk))))))
scheme@(guile-user)> (define param (make-parameter 0))
scheme@(guile-user)> (parameterize ((param 1))
(with-captured-dynenv
(lambda (dynenv)
(parameterize ((param 2))
(dynenv (lambda () (param)))))))
$2 = 1
But not this simpler one:
scheme@(guile-user)> (define (with-captured-dynenv proc)
(let ((tag (make-prompt-tag "dynenv-capture")))
(call-with-prompt
tag
(lambda ()
((abort-to-prompt tag)))
(lambda (call-in-captured-dynenv)
(proc call-in-captured-dynenv)))))
scheme@(guile-user)> (parameterize ((param 1))
(with-captured-dynenv
(lambda (dynenv)
(parameterize ((param 2))
(dynenv (lambda () (param)))))))
$3 = 2
Taylan