skill.lang.LETSEQ_VALUES

Last-modified: 2026-01-10 (土) 19:14:37
/******************************************************************************
 * 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]