【问题标题】:How to tranpose pattern sequence in Scheme macro?如何在 Scheme 宏中转置模式序列?
【发布时间】:2017-07-30 16:09:46
【问题描述】:

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

【问题讨论】:

    标签: macros scheme define-syntax


    【解决方案1】:

    对不起,我自己搞定了。这似乎有效。

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

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      相关资源
      最近更新 更多