chibi-scheme/lib/srfi/39/syntax.scm
2015-01-26 08:06:59 +09:00

29 lines
1.2 KiB
Scheme

;; param.scm -- SRFI-39 parameters
;; Copyright (c) 2010 Alex Shinn. All rights reserved.
;; BSD-style license: http://synthcode.com/license.txt
(define (parameter-convert param value)
(let ((proc (parameter-converter param)))
(if (procedure? proc)
(proc value)
value)))
(define (make-parameter init . o)
(let ((conv (and (pair? o) (car o))))
(%make-parameter (if conv (conv init) init) conv)))
(define-syntax parameterize
(syntax-rules ()
((parameterize ("step") old cons-new ((param value ptmp vtmp) ...) () body)
(let ((ptmp param) ...)
(let ((vtmp (parameter-convert ptmp value)) ...)
(let ((old (thread-parameters)))
(let ((new cons-new))
(dynamic-wind
(lambda () (thread-parameters-set! new))
(lambda () . body)
(lambda () (thread-parameters-set! old))))))))
((parameterize ("step") old cons-new args ((param value) . rest) body)
(parameterize ("step") old (cons (cons ptmp vtmp) cons-new) ((param value ptmp vtmp) . args) rest body))
((parameterize ((param value) ...) . body)
(parameterize ("step") old (thread-parameters) () ((param value) ...) body))))