Как транспонировать последовательность шаблонов в макросе схемы?
Я написал следующий макрос схемы.
(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) ...)))))