2014-10-30 3 views
0

내가 foo.js을 실행하기 위해 기본적으로 (m을 확장하기위한 것입니다 m라는 매크로를 정의하는 sweet.js 매크로가이sweet.js 매크로`m`을`m` 심볼로 확장 할 수 있습니까?

//foo.js 
m("foo") 

처럼 호출되는 곳 m라는 기능이있어 가정 컴파일 시간) I 매크로와는 달리, 기능은 일류 시민으로 주위에 전달 될 수 있기 때문에, m을 확장하지 할 경우에

의 기능

doSomething(m) //don't want to expand this as a macro 

매크로에서이 시나리오를 다루는 케이스가 없다면 sweet.js가 불평하므로 동일한 심볼로 확장되는 포괄 규칙을 가져야합니다.

macro m { 
    //simplification to demonstrate a case that recursively expand macro 
    case { _ ($foo, $bar) } => { return #{m($foo)} } 
    //does syntax unwrapping in real case 
    case { _ ($foo) } => { return #{$foo} } 

    //**this tries to recursively expand `m`, which is not what I want** 
    case { _ } => { return #{m} } 
} 

은 어떻게 m 매크로 매크로 다른 경우가 반복적으로 매크로로 m을 확장 할 필요가 않음을 감안할 때 m 기능으로 확장해야합니까?

답변

1

당신은 let 바인드에 매크로를 할 것입니다 :

let m = macro { 
    case { _ ($foo, $bar) } => { return #{$foo} } 
    case { _ ($foo) } => { return #{$foo} } 

    // `m` is bound to the surrounding scope, not the macro 
    case { _ } => { return #{m} } 
} 

편집 :

죄송합니다 :)

는 여기에 더 나은 귀하의 질문을 완전히 처음 읽어 보지 않았 솔루션을 사용하려면 두 개의 다른 매크로 (실제 재귀 작업을 수행 할 수있는 매크로와 비 재귀 기본 케이스를 처리 할 수있는 매크로)로 나눠야합니다.

function m() {} 
macro m_impl { 
    case { _ ($foo, $bar) } => { return #{m_impl($foo)} } 
    case { _ ($foo) } => { return #{$foo} } 
} 

let m = macro { 
    case { _ ($foo, $bar) } => { return #{m_impl($foo, $bar)} } 
    case { _ } => { return #{m} } 
} 

m (100, 200); 
doSomething(m) 
+0

사례 규칙 중 일부를 매크로로 확장해야하는 경우 (첫 번째 경우와 마찬가지로) – LeoHorie

+0

아, 죄송합니다. 질문을 너무 빨리 읽습니다. 잘하면 당신을위한 더 나은 솔루션입니다 편집. – timdisney

+0

아하, 완벽한 솔루션! 감사! – LeoHorie