sweet.js如何将函数语句与中缀匹配

时间:2015-02-15 05:22:16

标签: javascript sweet.js

我似乎无法获得匹配

let function = macro {
  case infix {$name:ident $[=] | _ ($params ...) { $body ...} } => {
    return #{
      $name = function $name ($params ...) {
        console.log($name.name);
        $body ...
      }
    }
  }
}
var add = function (x, y){
  return x+y;
}

SyntaxError: [macro] Macro `function` could not be matched with `() {} ...`
11: var add = function (x, y){
              ^

宏没有var就可以正常工作。

我知道表达式位置允许使用1个非expr术语 但var $name:ident $[=]无效。

如果使用infix这是不可能的,那么还有另一种匹配函数语句并捕获函数名称的方法吗?

2 个答案:

答案 0 :(得分:1)

我似乎需要从更广泛的范围内看待我的问题。正如@timdisney在上面解释的那样,

var xxx = function () {}

需要 var 宏,而不是功能宏。

// log function calls

    let var = macro {
      case {
        $_ $id = function ($params ...) {$body ...}
      } => {
        return #{
          var $id = function $id ($params ...) { 
            console.log($id.name);
            $body ...
          }
        };
      }
      case { $_ } => { return #{var}; }
    };

第二种情况是一种全能的方法,它可以使函数保持不变。它被称为身份规则。

答案 1 :(得分:0)

中缀和var的互动很特别。出于卫生原因,中缀宏只能在var初始值设定项中看到=。我一直在考虑如何缓解这种限制,但没有具体的内容。

虽然您可以制作一个var宏来完成您想要的任务,但是为了解决您的问题。