代码之家  ›  专栏  ›  技术社区  ›  Slartibartfast

如何将“rest”变量绑定到Scheme中宏中的值列表

  •  1
  • Slartibartfast  · 技术社区  · 16 年前

    我想制作一个用于编写匹配扩展的帮助宏。我有这样的想法:

    (define-match-expander my-expander
      (λ (stx)
        (let* ([dat (cdr (syntax-e stx))]
               [var1 (car dat))]
               [var2 (cadr dat)])
          ;transformer goes here )))
    

    所以我想要一个宏来完成这个让绑定。我从以下内容开始:

    (define-syntax-rule (define-my-expander (id vars ...) body)
      (define-match-expander id
        (λ (stx)
          (match-let ([(vars ...) (cdr (syntax-e stx))])
            body))))
    

    但是 match-let

    第一个问题是,有没有其他方法可以做到这一点(我的意思是制造扩展器)?也许在plt方案中已经有一些类似的东西我不知道,或者我在某种程度上做错了。

    不管第一个问题的答案是什么,如果我想将变量列表绑定到宏中的值列表,我应该怎么做?

    编辑:与Eli的answer宏结合使用,现在看起来如下所示:

    (define-syntax-rule (define-my-expander (id vars ...) body)
      (define-match-expander id
        (λ (stx)
          (syntax-case stx ()
            [(_ vars ...)
             body]))))
    
    1 回复  |  直到 16 年前
        1
  •  4
  •   Eli Barzilay    16 年前

    我不知道你想要实现什么,但我猜这是正确的方向:

    (define-match-expander my-expander
      (lambda (stx)
        (syntax-case stx ()
          [(_ (var1 var2) stuff ...)
           ;; use #'var1 #'var2 and #'(stuff ...) here
           ])))
    

    syntax-e 用于“展开”语法对象并给出它所包含的内容——但实际内容可能会让您感到惊讶。例如 (foo . (bar)) (foo bar) syntax-case 为您进行模式匹配是非常必要的