2014-09-30 4 views
1

я попытался определить sweet.js макрос, который позволяет другим повторяющиеся макросы должны быть определены более легко, но я нашел ошибку синтаксиса здесь:Можно ли макросам sweet.js определить другие макросы?

SyntaxError: [patterns] Ellipses level does not match in the template 
11:     { $($b...)... } 

Это макрос, который произвел эту ошибку синтаксиса:

macro repeatingMacro{ 
    rule{ 
     $a { 
      $b... 
     } { 
      $c... 
     } 
    } => { 
     //the output of this macro should be another macro with repeating patterns 
     macro $a { 
      rule{ 
       { $($b...)... } 
      } => { 
       { $($c...)... } 
      } 
     } 
    } 
} 

Если этот макрос был правильно определен, то это позволит другим макросы, которые будут созданы, как это:

repeatingMacro cond { 
    $a... { $b... } 
} 
{ 
    if($a...){ 
     $b... 
    } 
} 

var x = 1; 
var y = 2; 
cond { 
(x > y) { 
     alert(x); 
} 
(x < y) { 
     alert(y) 
} 
} 

This code can be edited online here.

Другими словами, можно определить макрос, который будет автоматически преобразовывать этот макрос:

macro cond { 
    rule { 
    $x... { $y... } 
} => { 
    if($x...){ 
    $y... 
} 
} 
} 

... в этот макрос?

macro cond { 
    rule { 
    { $($x... { $y... })... } 
} => { 
    $(if($x...){ 
    $y... 
})... 
} 
} 
+0

Чтобы ответить на титульный вопрос: Да. Например, см. Https://gist.github.com/natefaubion/f4be4c8531ef45de87b4. – Havvy

ответ

3

Непосредственная проблема вы работаете в том, что если вам нужно, чтобы излучать буквальные эллипсы ... в шаблоне макроса вам нужно, чтобы избежать его, делая $[...].

Но на более высоком уровне вы уверены, что вам нужно перейти к макроопределению макросов здесь? Sweet.js на самом деле имеет приятную декларативную функцию, которая называется macroclass (задокументирована here), что делает такие вещи очень просто. Фактически, cond является примером, который мы используем:

// define the cond_clause pattern class 
macroclass cond_clause { 
    pattern { 
    rule { $check:expr => $body:expr } 
    } 
} 

macro cond { 
    rule { $first:cond_clause $rest:cond_clause ... } => { 
    // sub-pattern variables in the custom class are 
    // referenced by concatenation 
    if ($first$check) { 
     $first$body 
    } $(else if ($rest$check) { 
     $rest$body 
    }) ... 
    } 
} 

cond 
    x < 3 => console.log("less than 3") 
    x == 3 => console.log("3") 
    x > 3 => console.log("greater than 3") 
Смежные вопросы