/******************************************************************************
* LETSEQ_VALUES
* Ver: 20220701
*
* Derived from SRFI-11 and-let*.
* (https://srfi.schemers.org/srfi-11/srfi-11.html)
******************************************************************************/
;
(define_syntax LETSEQ_VALUES
(syntax_rules ()
((LETSEQ_VALUES (bindings ...) body bodies ...)
(LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (bindings ...)
"letseq clauses:" ()
"bodies:" (body bodies ...)))
;
/* when there are no (more) multi-value bindings, and there is no preceding single-value binding */
((LETSEQ_VALUES
"LETSEQ_VALUES clauses:" ()
"letseq clauses:" ()
"bodies:" (body bodies ...))
(let () body bodies ...))
;
/* when there are no (more) multi-value bindings, and there is a preceding single-value binding */
((LETSEQ_VALUES
"LETSEQ_VALUES clauses:" ()
"letseq clauses:" (letseq_binding)
"bodies:" (body bodies ...))
(let (letseq_binding) body bodies ...))
;
/* when there are no (more) multi-value bindings, and there are some preceding single-value bindings */
((LETSEQ_VALUES
"LETSEQ_VALUES clauses:" ()
"letseq clauses:" (letseq_bindings ...)
"bodies:" (body bodies ...))
(letseq (letseq_bindings ...) body bodies ...))
;
/* multi-value binding, when there is no preceding single-value binding */
((LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (((var vars ...) expr) bindings ...)
"letseq clauses:" ()
"bodies:" (body bodies ...))
(apply
(lambda (var vars ...)
(LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (bindings ...)
"letseq clauses:" ()
"bodies:" (body bodies ...)))
expr))
;
/* multi-value binding, when there is a preceding single-value binding */
((LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (((var vars ...) expr) bindings ...)
"letseq clauses:" (letseq_binding)
"bodies:" (body bodies ...))
(let (letseq_binding)
(apply
(lambda (var vars ...)
(LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (bindings ...)
"letseq clauses:" ()
"bodies:" (body bodies ...)))
expr)))
;
/* multi-value binding, when there are some preceding single-value bindings */
((LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (((var vars ...) expr) bindings ...)
"letseq clauses:" (letseq_bindings ...)
"bodies:" (body bodies ...))
(letseq (letseq_bindings ...)
(apply
(lambda (var vars ...)
(LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (bindings ...)
"letseq clauses:" ()
"bodies:" (body bodies ...)))
expr)))
;
/* single-value binding */
((LETSEQ_VALUES
"LETSEQ_VALUES clauses:" ((var expr) bindings ...)
"letseq clauses:" (letseq_bindings ...)
"bodies:" (body bodies ...))
(LETSEQ_VALUES
"LETSEQ_VALUES clauses:" (bindings ...)
"letseq clauses:" (letseq_bindings ... (var expr))
"bodies:" (body bodies ...)))
;
/* invalid form */
((LETSEQ_VALUES args ...)
(error "Invalid LETSEQ_VALUES form: %L" (quote (LETSEQ_VALUES args ...))))))
;
; ==============================================================================
; [EOF]