From e37011f35895df977bd62f1d2a678196aa8790ae Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 8 Jul 2013 22:34:54 +0900 Subject: [PATCH] Deferring execution of defaults. --- lib/chibi/optional.scm | 12 ++++++++++-- lib/chibi/optional.sld | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/chibi/optional.scm b/lib/chibi/optional.scm index 003d59b0..f128b61b 100644 --- a/lib/chibi/optional.scm +++ b/lib/chibi/optional.scm @@ -23,6 +23,14 @@ (cond ((memq key ls) => cadr) (else (and (pair? o) (car o))))) +(define-syntax keyword-ref* + (syntax-rules () + ((keyword-ref* ls key default) + (cond ((memq key ls) => cadr) (else default))))) + +(define (symbol->keyword sym) + (string->symbol (string-append (symbol->string sym) ":"))) + (define-syntax let-keywords* (syntax-rules () ((let-keywords* opt-ls () . body) @@ -31,10 +39,10 @@ (let ((tmp (op . args))) (let-keywords* tmp vars . body))) ((let-keywords* opt-ls ((var default) . rest) . body) - (let ((var (keyword-ref opt-ls 'var default))) + (let ((var (keyword-ref* opt-ls (symbol->keyword 'var) default))) (let-keywords* opt-ls rest . body))) ((let-keywords* opt-ls ((var key default) . rest) . body) - (let ((var (keyword-ref opt-ls 'key default))) + (let ((var (keyword-ref* opt-ls 'key default))) (let-keywords* opt-ls rest . body))) ((let-keywords* opt-ls tail . body) (let ((tail opt-ls)) . body)))) diff --git a/lib/chibi/optional.sld b/lib/chibi/optional.sld index a77b3e33..5ed1321d 100644 --- a/lib/chibi/optional.sld +++ b/lib/chibi/optional.sld @@ -1,6 +1,6 @@ (define-library (chibi optional) (export let-optionals let-optionals* opt-lambda - let-keywords let-keywords* keyword-ref) + let-keywords let-keywords* keyword-ref keyword-ref*) (import (chibi)) (include "optional.scm"))