0

我似乎找不到比赛

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 个非表达式术语,但var $name:ident $[=]不起作用。

如果使用中缀这是不可能的,是否有另一种方法来匹配函数语句并捕获函数的名称?

4

2 回答 2

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}; }
    };

第二种情况是返回函数不变的包罗万象。它被称为身份规则。

于 2015-02-16T18:41:18.003 回答
0

中缀和的交互var是特殊的。出于卫生原因,中缀宏只能返回到=var 初始化程序中。我一直在考虑如何放宽这种限制,但还没有具体的。

为了解决您的问题,尽管您可以制作一个var执行您想要的操作的宏。

于 2015-02-15T22:12:29.997 回答