Parameters

;; Parameters: dynamically scoped settings (R7RS, SRFI-39)
(define indent-level (make-parameter 0))
(define (log-line msg)
  (display (make-string (* 2 (indent-level)) #\space))
  (display msg)
  (newline))

(define (process)
  (log-line "processing")
  (parameterize ((indent-level (+ (indent-level) 1)))   ; rebinding visible to everything called inside
    (log-line "step 1")
    (log-line "step 2")))

(log-line "start")
(process)
(log-line "end")
;; start
;; processing
;;   step 1
;;   step 2
;; end

;; Converter procedure: validates/transforms new values
(define precision (make-parameter 2 (lambda (x) (if (and (integer? x) (>= x 0)) x (error "bad precision" x)))))
(parameterize ((precision 4)) (precision))   ; 4

;; Standard ports are parameters
(parameterize ((current-output-port (open-output-string)))
  (display "captured"))                      ; nothing printed to the console