我写了以下Scheme宏。
(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
变量的方式?
更新:有人告诉我,根据R7RS 4.3.2,此问题中的join
宏是非法的:
子模式中出现的模式变量,后跟一个或多个 仅在子模板中允许标识符⟨ellipsis的实例 接下来是⟨ellipsis的多个实例。
答案 0 :(得分:0)
(define-syntax join
(syntax-rules ()
((_ var val ...)
(let-syntax ((j (syntax-rules ::: ()
((_ (k :::) (v :::))
'((k v) :::)))))
`(,(j var val) ...)))))