sweet.js 替换这个。和 @

sweet.js replace this. with @

我想用咖啡脚本中的 @ 符号替换 this.。我写了宏:

macro (@) {
    case { return $a } => { return this.$a }
}

function LogSmth(name) {
    this.name = name;
    console.log(@name);
}

但是得到了

SyntaxError: [macro] Macro `@` could not be matched with `name...`
57:     console.log(@name);

如何解决这个问题?

个案必须return一个语法数组。因此,您可以通过执行以下操作来修复您的问题:

macro @ {
    case { _ } => { return #{ this. } }
}

或者您可以使用不使用任何模式的简单 rule 生成此文件。

macro @ {
    rule {
    } => {
        this.
    }
}

请允许我扩展 Mike C 的回答。如果我们尝试只用 @ 做一些事情会发生什么(一个常见的操作是将一个对象绑定到 this)。有人可能会这样写:X.bind(@, ...) 但是上面的宏会失败。另一种可能性是能够做到这一点:@['some property with a weird name'],但是上面的宏也会失败。

这是我的版本:

macro @ {
  rule { [$x:expr] } => { this[$x] }
  rule { $x:ident } => { this.$x }
  rule {} => { this }
}

这也公开了一个有用的 属性 关于将规则应用于宏的规则,即顺序很重要。