(define-module (srfi 39) (export make-parameter parameterize) (import-immutable (scheme)) (body (define (make-parameter value . o) (if (pair? o) (let ((converter (car o))) (lambda args (if (null? args) value (set! value (converter (car args)))))) (lambda args (if (null? args) value (set! value (car args)))))) (define-syntax parameterize (syntax-rules () ((parameterize ("step") ((param value tmp1 tmp2) ...) () body) (let ((tmp1 value) ...) (let ((tmp2 (param)) ...) (dynamic-wind (lambda () (param tmp1) ...) (lambda () . body) (lambda () (param tmp2) ...))))) ((parameterize ("step") args ((param value) . rest) body) (parameterize ("step") ((param value tmp1 tmp2) . args) rest body)) ((parameterize ((param value) ...) . body) (parameterize ("step") () ((param value) ...) body))))))