如何在 Schema 宏中转置模式序列?
How to tranpose pattern sequence in Scheme macro?
我写了下面的 Scheme 宏。
(define-syntax join
(syntax-rules ()
((join (var ...) (val ...) ...)
'(((var val) ...)
...))))
当我尝试的时候
(join (a b c)
(1 2 3)
(2 4 6)
(3 6 9))
它returns结果如下。
(((a 1) (a 2) (a 3))
((b 2) (b 4) (b 6))
((c 3) (c 6) (c 9)))
不过我的本意是写一个宏,结果returns下面的结果。
(((a 1) (b 2) (c 3))
((a 2) (b 4) (c 6))
((a 3) (b 6) (c 9)))
如何转置模式匹配器逐项列出 var
变量的方式?
更新: 有人告诉我,根据 R7RS 4.3.2,此问题中的 join
宏是非法的:
Pattern variables that occur in subpatterns followed by one or more
instances of the identifier ⟨ellipsis⟩ are allowed only in subtemplates
that are followed by as many instances of ⟨ellipsis⟩.
抱歉,我自己搞定了。这似乎有效。
(define-syntax join
(syntax-rules ()
((_ var val ...)
(let-syntax ((j (syntax-rules ::: ()
((_ (k :::) (v :::))
'((k v) :::)))))
`(,(j var val) ...)))))
我写了下面的 Scheme 宏。
(define-syntax join
(syntax-rules ()
((join (var ...) (val ...) ...)
'(((var val) ...)
...))))
当我尝试的时候
(join (a b c)
(1 2 3)
(2 4 6)
(3 6 9))
它returns结果如下。
(((a 1) (a 2) (a 3))
((b 2) (b 4) (b 6))
((c 3) (c 6) (c 9)))
不过我的本意是写一个宏,结果returns下面的结果。
(((a 1) (b 2) (c 3))
((a 2) (b 4) (c 6))
((a 3) (b 6) (c 9)))
如何转置模式匹配器逐项列出 var
变量的方式?
更新: 有人告诉我,根据 R7RS 4.3.2,此问题中的 join
宏是非法的:
Pattern variables that occur in subpatterns followed by one or more instances of the identifier ⟨ellipsis⟩ are allowed only in subtemplates that are followed by as many instances of ⟨ellipsis⟩.
抱歉,我自己搞定了。这似乎有效。
(define-syntax join
(syntax-rules ()
((_ var val ...)
(let-syntax ((j (syntax-rules ::: ()
((_ (k :::) (v :::))
'((k v) :::)))))
`(,(j var val) ...)))))