Deferring execution of defaults.

This commit is contained in:
Alex Shinn 2013-07-08 22:34:54 +09:00
parent 53cecd82b2
commit e37011f358
2 changed files with 11 additions and 3 deletions

View file

@ -23,6 +23,14 @@
(cond ((memq key ls) => cadr) (cond ((memq key ls) => cadr)
(else (and (pair? o) (car o))))) (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* (define-syntax let-keywords*
(syntax-rules () (syntax-rules ()
((let-keywords* opt-ls () . body) ((let-keywords* opt-ls () . body)
@ -31,10 +39,10 @@
(let ((tmp (op . args))) (let ((tmp (op . args)))
(let-keywords* tmp vars . body))) (let-keywords* tmp vars . body)))
((let-keywords* opt-ls ((var default) . rest) . 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 rest . body)))
((let-keywords* opt-ls ((var key default) . 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 rest . body)))
((let-keywords* opt-ls tail . body) ((let-keywords* opt-ls tail . body)
(let ((tail opt-ls)) . body)))) (let ((tail opt-ls)) . body))))

View file

@ -1,6 +1,6 @@
(define-library (chibi optional) (define-library (chibi optional)
(export let-optionals let-optionals* opt-lambda (export let-optionals let-optionals* opt-lambda
let-keywords let-keywords* keyword-ref) let-keywords let-keywords* keyword-ref keyword-ref*)
(import (chibi)) (import (chibi))
(include "optional.scm")) (include "optional.scm"))