2016-01-22 2 views
0

Я хочу заменить this. на @ знак, как в сценарии кофе. Я пишу макрос:sweet.js замените это. с @

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); 

Как это исправить?

ответ

3

Позвольте мне расширить ответ Майка С. Что произойдет, если мы попытаемся сделать что-то только с @ (общей операцией является привязка объекта к this). Можно написать: X.bind(@, ...), но с этим макросом это не получится. Другая возможность заключается в возможности сделать это: @['some property with a weird name'], но это также потерпит неудачу с вышеупомянутым макросом.

Вот моя версия:

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

Это также предоставляет одно полезное свойство о применении правил для макросов, которые в том, что порядок имеет значение.

+0

Спасибо. Я сделал это ответом для будущих исследователей. –

2

Случаи должны возвращать массив синтаксиса. Таким образом, вы можете исправить ваши, выполнив следующие действия:

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

Или вы могли бы произвести это с помощью простого rule, который не использует какой-либо модели.

macro @ { 
    rule { 
    } => { 
     this. 
    } 
} 
Смежные вопросы