From ad068bc1f86ccc88351e459cd83b4f35c6fa81cf Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 28 Dec 2009 21:05:25 +0900 Subject: [PATCH] adding srfi-39 --- lib/srfi/39.module | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 lib/srfi/39.module 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))))))