0

我正在尝试用 sweetjs 编写一个宏来

{a,b,c}

{a:'',b:'',c:''}

基本上我想列出一个对象的属性并创建一个具有该属性的空原型。

我写的规则是

macro basic {
  rule { { $x (,) ... } } => {
    {($x = 3)(,) ...}
  }
}

如果我有

basic { a, b, c }

它扩展到

{ a = 3, b = 3, c = 3;}

但是如果我改变我得到= 3: ''

意外的令牌:[... ( a : ) , ...]

(另外我不知道为什么它;在扩展的末尾添加一个 after c = 3

任何想法?

4

2 回答 2

1

您需要使用$()而不是裸括号来使键值对读取为单个重复模式。

macro basic {
  rule { { $x (,) ... } } => {
    { $($x: 3) (,) ... }
  }
}

不过,值得注意的是,这不是您需要宏的情况。一个普通的函数可以很容易地做到这一点——你只需要使用括号而不是花括号和字符串而不是裸标识符。

于 2014-02-11T19:27:40.537 回答
1

好的,我以不同的方式解决了,因为我不知道如何使用 : (因为它是用于指定令牌类型的特殊字符)我使用了一个临时变量:

macro basic {
  rule { { $x (,) ... } } => {
    var tmp = {};
    (tmp [toString $x] = undefined)(;)
    ... 
  }
 }
于 2014-02-11T19:05:32.163 回答