diff --git a/lib/srfi/39.module b/lib/srfi/39.module new file mode 100644 index 00000000..11b9ed9f --- /dev/null +++ b/lib/srfi/39.module @@ -0,0 +1,25 @@ + +(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))))))