如何在Scheme宏中转换模式序列?

时间:2017-03-09 15:32:36

标签: macros scheme define-syntax

我写了以下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的多个实例。

1 个答案:

答案 0 :(得分:0)

抱歉,但我自己也明白了。这似乎有效。

(define-syntax join
  (syntax-rules ()
    ((_ var val ...)
     (let-syntax ((j (syntax-rules ::: ()
                       ((_ (k :::) (v :::))
                        '((k v) :::)))))
       `(,(j var val) ...)))))