0

関数宣言ではなく、関数式のみであるため、Coffeescript の関数はホイストできません。関数宣言を coffeescript に追加するマクロを作成するにはどうすればよいですか?

具体的には、私は欲しい:

foo(bar, baz) ->

にコンパイルするには:

function foo(bar, baz) {
}

それ以外の:

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

2 に答える 2

0

fooJavaScript で記述し、それをバッククォートを使用して 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 は異なる言語です。JavaScript 用語で考えながら CoffeeScript を記述しようとすると、混乱が生じるだけです。それらは多くを共有し、CoffeeScript は JavaScript にコンパイル/変換されますが、同じ言語ではないため、異なる方法で操作します。C++ で C コードを書くな、Scala で Java を書くな、CoffeeScript で JavaScript を書くな…

于 2013-07-04T20:13:06.833 に答える
-1

あなたが何を達成しようとしているのかはよくわかりませんが、あなたが望むものに最も近いのはこれです

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

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

foo("lala") #prints lala

また、CoffeeScript 構文にとどまることをお勧めします。関数宣言のような重要なことを修正する「マクロ」は、混乱を招く可能性があります。特に何も勝てないので、まったく逆です。

于 2013-07-04T22:15:18.413 に答える