adding opt-lambda* and define-opt*

This commit is contained in:
Alex Shinn 2021-06-28 17:27:22 +09:00
parent 0fbd89dd00
commit 378b56a0c3
3 changed files with 42 additions and 8 deletions

View file

@ -47,6 +47,16 @@
((opt-lambda (a (b 11) (c 12))
(list a b c))
0))
(test '(0 11 2)
(let ((b 1))
((opt-lambda (a (b 11) (c (* b 2)))
(list a b c))
0)))
(test '(0 11 22)
(let ((b 1))
((opt-lambda* (a (b 11) (c (* b 2)))
(list a b c))
0)))
(test '(0 1 (2 3 4))
(let-optionals* '(0 1 2 3 4) ((a 10) (b 11) . c)
(list a b c)))

View file

@ -71,16 +71,26 @@
(define-syntax opt-lambda
(syntax-rules ()
((opt-lambda vars . body)
(opt-lambda/aux () vars . body))))
(opt-lambda/aux let-optionals () vars . body))))
;;> \macro{(opt-lambda* ((var default) ... [rest]) body ...)}
;;>
;;> Variant of \scheme{opt-lambda} which binds using
;;> \scheme{let-optionals*}.
(define-syntax opt-lambda*
(syntax-rules ()
((opt-lambda* vars . body)
(opt-lambda/aux let-optionals* () vars . body))))
(define-syntax opt-lambda/aux
(syntax-rules ()
((opt-lambda/aux (args ...) ((var . default) . vars) . body)
((opt-lambda/aux let-opt (args ...) ((var . default) . vars) . body)
(lambda (args ... . o)
(let-optionals o ((var . default) . vars) . body)))
((opt-lambda/aux (args ...) (var . vars) . body)
(opt-lambda/aux (args ... var) vars . body))
((opt-lambda/aux (args ...) () . body)
(let-opt o ((var . default) . vars) . body)))
((opt-lambda/aux let-opt (args ...) (var . vars) . body)
(opt-lambda/aux let-opt (args ... var) vars . body))
((opt-lambda/aux let-op (args ...) () . body)
(lambda (args ... . o)
. body))))
@ -95,6 +105,17 @@
((define-opt (name . vars) . body)
(define name (opt-lambda vars . body)))))
;;> \macro{(define-opt* (name (var default) ... [rest]) body ...)}
;;>
;;> Shorthand for
;;> \schemeblock{
;;> (define name (opt-lambda* (var default) ... [rest]) body ...)}
(define-syntax define-opt*
(syntax-rules ()
((define-opt* (name . vars) . body)
(define name (opt-lambda* vars . body)))))
(define (mem-key key ls)
(and (pair? ls)
(pair? (cdr ls))

View file

@ -1,7 +1,10 @@
(define-library (chibi optional)
(export let-optionals let-optionals* opt-lambda define-opt
let-keywords let-keywords* keyword-ref keyword-ref*)
(export let-optionals let-optionals*
opt-lambda opt-lambda*
define-opt define-opt*
let-keywords let-keywords*
keyword-ref keyword-ref*)
(cond-expand
(chibi
(import (chibi))