sweetjs добавив: ''

Я пытаюсь написать макрос с 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:),...]

(Плюс я не знаю, почему это добавить ; в конце расширения после c = 3)

Любая идея?

2 ответа

Вам нужно использовать $() вместо чистых паренов, чтобы пары ключ-значение читались как один повторяющийся шаблон.

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

Однако стоит отметить, что это не тот случай, когда вам нужен макрос. Нормальная функция могла бы сделать это довольно легко - вам просто нужно использовать символы скобки вместо фигурных скобок и строки вместо голых идентификаторов.

Хорошо, я решил по-другому, так как я не знал, как использовать: (поскольку это специальный символ, используемый для указания типа токена), я использовал переменную temp:

macro basic {
  rule { { $x (,) ... } } => {
    var tmp = {};
    (tmp [toString $x] = undefined)(;)
    ... 
  }
 }
Другие вопросы по тегам