関数宣言ではなく、関数式のみであるため、Coffeescript の関数はホイストできません。関数宣言を coffeescript に追加するマクロを作成するにはどうすればよいですか?
具体的には、私は欲しい:
foo(bar, baz) ->
にコンパイルするには:
function foo(bar, baz) {
}
それ以外の:
foo(bar, baz)(function() {});
関数宣言ではなく、関数式のみであるため、Coffeescript の関数はホイストできません。関数宣言を coffeescript に追加するマクロを作成するにはどうすればよいですか?
具体的には、私は欲しい:
foo(bar, baz) ->
にコンパイルするには:
function foo(bar, baz) {
}
それ以外の:
foo(bar, baz)(function() {});
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 は異なる言語です。JavaScript 用語で考えながら CoffeeScript を記述しようとすると、混乱が生じるだけです。それらは多くを共有し、CoffeeScript は JavaScript にコンパイル/変換されますが、同じ言語ではないため、異なる方法で操作します。C++ で C コードを書くな、Scala で Java を書くな、CoffeeScript で JavaScript を書くな…
あなたが何を達成しようとしているのかはよくわかりませんが、あなたが望むものに最も近いのはこれです
func = (name) ->
(body) ->
window[name] = body
func("foo") (arg)-> console.log(arg)
foo("lala") #prints lala
また、CoffeeScript 構文にとどまることをお勧めします。関数宣言のような重要なことを修正する「マクロ」は、混乱を招く可能性があります。特に何も勝てないので、まったく逆です。