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