Как транспонировать последовательность шаблонов в макросе схемы?

Я написал следующий макрос схемы.

(define-syntax join
  (syntax-rules ()
    ((join (var ...) (val ...) ...)
     '(((var val) ...)
       ...))))

Когда я попробую это

(join (a b c)
      (1 2 3)
      (2 4 6)
      (3 6 9))

он возвращает следующий результат.

(((a 1) (a 2) (a 3))
 ((b 2) (b 4) (b 6))
 ((c 3) (c 6) (c 9)))

Но я намеревался написать макрос, который возвращает следующий результат.

(((a 1) (b 2) (c 3))
 ((a 2) (b 4) (c 6))
 ((a 3) (b 6) (c 9)))

Как транспонировать способ сопоставления шаблонов var переменная?


Обновление: мне сказали, что join макрос в этом вопросе недопустим в соответствии с R7RS 4.3.2:

Переменные шаблона, которые встречаются в подшаблонах, за которыми следует один или несколько экземпляров идентификатора "ellipsis", допускаются только в подшаблонах, за которыми следует столько же экземпляров "ellipsis".

1 ответ

Извините, но я получил это сам. Это похоже на работу.

(define-syntax join
  (syntax-rules ()
    ((_ var val ...)
     (let-syntax ((j (syntax-rules ::: ()
                       ((_ (k :::) (v :::))
                        '((k v) :::)))))
       `(,(j var val) ...)))))
Другие вопросы по тегам