1

我试图定义一个 sweet.js 宏,它允许更容易地定义其他重复宏,但我在这里发现了一个语法错误:

SyntaxError: [patterns] Ellipses level does not match in the template
11:                 { $($b...)... }

这是产生此语法错误的宏:

macro repeatingMacro{
    rule{
        $a {
            $b...
        } {
            $c...
        }
    } => {
        //the output of this macro should be another macro with repeating patterns
        macro $a {
            rule{
                { $($b...)... }
            } => {
                { $($c...)... }
            }
        }
    }
}

如果这个宏被正确定义,那么它将允许创建其他宏,比如这个:

repeatingMacro cond {
    $a... { $b... }
}
{
    if($a...){
        $b...
    }
}

var x = 1;
var y = 2;
cond {
(x > y) {
      alert(x);
}
(x < y) {
      alert(y)
}
}

此代码可以在此处在线编辑。

换句话说,是否可以定义一个将自动转换此宏的宏:

macro cond {
  rule {
    $x... { $y... }
} => {
  if($x...){
  $y...
}
}
}

...进入这个宏?

macro cond {
  rule {
    { $($x... { $y... })... }
} => {
  $(if($x...){
  $y...
})...
}
}
4

1 回答 1

3

您遇到的直接问题是,如果您需要...在宏的模板中发出文字省略号,您需要通过执行$[...].

但是在更高的层次上,您确定需要在这里进行宏定义宏的工作吗?Sweet.js 实际上有一个很好的声明性功能,称为macroclass在此处记录),它使做这样的事情变得非常简单。其实cond就是我们用的例子:

// define the cond_clause pattern class
macroclass cond_clause {
  pattern {
    rule { $check:expr => $body:expr }
  }
}

macro cond {
  rule { $first:cond_clause $rest:cond_clause ... } => {
    // sub-pattern variables in the custom class are 
    // referenced by concatenation
    if ($first$check) {
      $first$body
    } $(else if ($rest$check) {
      $rest$body
    }) ...
  }
}

cond
  x < 3  => console.log("less than 3")
  x == 3 => console.log("3")
  x > 3  => console.log("greater than 3")
于 2014-10-01T01:32:19.477 回答