2013-07-04 3 views
0

Функции в Coffeescript нельзя поднимать, поскольку он не выполняет декларации, а только выражения функций. Как написать макрос, чтобы добавить объявления функций в coffeescript?макрос coffeescript для объявлений функций

В частности, я хочу:

foo(bar, baz) -> 

составить до:

function foo(bar, baz) { 
} 

вместо:

foo(bar, baz)(function() {}); 

ответ

0

Я не думаю, что вы можете сделать, если вы не хотите напишите foo в JavaScript и вставьте его в свой CoffeeScript, используя обратные ссылки. Например:

console.log f 'x' 
`function f(x) { return x }` 

становится этот JavaScript:

console.log(f('x')); 
function f(x) { return x }; 

и f будет выполняться по желанию.

Если вы хотите изменить, как CoffeeScript интерпретирует foo(bar, baz) ->, тогда вам придется отредактировать парсер и разобраться со всеми побочными эффектами и сломанным кодом. Результат будет похож на CoffeeScript, но это не будет CoffeeScript.

CoffeeScript и JavaScript - это разные языки, пытаясь написать CoffeeScript, в то время как вы думаете в терминах JavaScript, это просто испортит вещи; они разделяют много, и CoffeeScript скомпилирован/переведен на JavaScript, но они не являются одним и тем же языком, поэтому вы работаете с ними по-разному. Не пишите C-код на C++, не пишите Java в Scala, не пишите JavaScript в CoffeeScript, ...

-1

Я действительно не уверен, что вы пытаетесь выполнить, но самое близкое к тому, что вы хотите это

func = (name) -> 
    (body) -> 
     window[name] = body 

func("foo") (arg)-> console.log(arg) 

foo("lala") #prints lala 

Я также хотел бы предложить, чтобы остаться с CoffeeScript синтаксиса «макро», что redresses такая важная вещь, как объявление функции привязанный к путанице. Тем более, что вы ничего не выигрываете - совсем наоборот.

+0

Но это не приведет к определению функции в верхней части области действия 'function f() {...}' делает это 'foo ('x'); func ('foo') (x) -> console.log (x) 'даст вам TypeError, тогда как JavaScript' foo ('x'); функция foo (x) {console.log (x)} 'будет работать. –

+0

Вы правы, он не поднимает функцию. – robkuz

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