2015-02-23 2 views
0

tl;drКаков правильный способ ссылаться на один макрос sweet.js от другого?

, когда у меня есть макрос в отдельных файлах, я получаю сообщение об ошибке, но если макросы находятся в одном файле, это работает.

test-macro-1.js:

macro genVar { 
    case {$name ($varName, $varVal, $name2)} => { 
    letstx $ident = [makeIdent(unwrapSyntax(#{$varName}), #{$name2})]; 
    return #{var $ident = $varVal} 
    } 
} 

export genVar; 

test-macro-2.js:

macro someVars { 
    case {$name()} => { 
    return #{ 
     genVar('foo', 'hello world', $name); 
     genVar('bar', 'goodbye cruel world', $name) 
    } 
    } 
} 

export someVars; 

test.js:

someVars(); 

console.log('foo=%s', foo); 
console.log('bar=%s', bar); 

results:

$ sjs -r --module ./test-macro-1.js --module ./test-macro-2.js test.js 
/usr/local/lib/node_modules/sweet.js/lib/sweet.js:90 
        throw new SyntaxError(syn.printSyntaxError(source$2, err)) 
         ^
SyntaxError: [macro] Macro `someVars` could not be matched with `...` 
1: someVars(); 
^
    at expand$2 (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:90:27) 
    at parse (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:123:29) 
    at Object.compile (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:129:19) 
    at Object.exports.run (/usr/local/lib/node_modules/sweet.js/lib/sjs.js:85:27) 
    at Object.<anonymous> (/usr/local/lib/node_modules/sweet.js/bin/sjs:7:23) 
    at Module._compile (module.js:460:26) 
    at Object.Module._extensions..js (module.js:478:10) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 
    at Function.Module.runMain (module.js:501:10) 

но ... если я поместить макрос в том же файле, как так:

test-macro-1.js:

macro genVar { 
    case {$name ($varName, $varVal, $name2)} => { 
    letstx $ident = [makeIdent(unwrapSyntax(#{$varName}), #{$name2})]; 
    return #{var $ident = $varVal} 
    } 
} 

export genVar; 

macro someVars { 
    case {$name()} => { 
    return #{ 
     genVar('foo', 'hello world', $name); 
     genVar('bar', 'goodbye cruel world', $name) 
    } 
    } 
} 

export someVars; 

results:

$ sjs -r --module ./test-macro-1.js test.js 
var foo = 'hello world'; 
var bar = 'goodbye cruel world'; 
console.log('foo=%s', foo); 
console.log('bar=%s', bar); 

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

ответ

1

К сожалению, ограничение нашей нынешней так называемой «модульной» системы. Макросы, экспортируемые из модуля, будут привязаны только к экспортируемому файлу и цели компиляции (поэтому genVar связан только в test-macro-1.js и test.js). Обычно то, что люди делают, определяет все свои макросы в одном файле macros.js и просто использует это для компиляции.

Мы работаем над реальным module system, который решает эту и другие болевые точки, но еще не готов.

+0

святое дерьмо, это один монстр тянет-запрос ...! –

+0

, но, серьезно, с первого взгляда, модульная система выглядит неплохо. за то, что я делаю, могу поместить оба макроса в один и тот же файл, но, как правило, было бы здорово компоновать макросы из пакетов diff. Если у вас есть момент, было бы замечательно посмотреть, как будет выглядеть новый синтаксис, чтобы решить этот пример использования. если вы укажете меня в правильном направлении, я был бы счастлив проверить его с вашим p/r. мой конкретный случай использования довольно тривиален, но чем больше я становлюсь акклиматизированным, тем более впечатлен я со сладким, очень мощным. отличная работа tim, thx! –

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