2016-02-05 2 views
4

Я хочу, чтобы определить сладкий макрос, который трансформируетsweet.js: преобразование вхождений повторный маркер

{ a, b } # o 

в

{ o.a, o.b } 

Моя текущая попытка

macro (#) { 
    case infix { { $prop:ident (,) ... } | _ $o } => { 
    return #{ { $prop: $o.$prop (,) ... } } 
    } 
} 

Однако, это дает мне

SyntaxError: [patterns] Ellipses level does not match in the template 

Я подозреваю, что я действительно не понимаю, как работает ..., и может потребоваться каким-то образом выполнить цикл над значениями $prop и построить объекты синтаксиса для каждого и каким-то образом связать их, но я не понимаю, как это сделать что.

ответ

3

Проблема заключается в расширении синтаксиса, который вы пытаетесь развернуть $o.$prop вместо $prop: $o.$prop. Вот решение:

macro (#) { 
    rule infix { { $prop:ident (,) ... } | $o:ident } => { 
    { $($prop: $o.$prop) (,) ... } 
    } 
} 

Обратите внимание, что я поставил блок кода в $() блоке своей собственной, чтобы устранить неоднозначность расширения эллипса.

Пример: var x = { a, b } # o; становится var x = { a: o.a, b: o.b };.

Смежные вопросы