🦈
V 言語にはクロージャがない。
前置き
V 言語のチェッカが匿名関数をクロージャのように扱っているというバグが修正されました[1]。
具体的には以下のようなコードです。
fn main() {
i := 0
f := fn() { println(i) }
f()
}
以前はこれがチェッカをすり抜けて C のコンパイルエラーになっていました。また、ドキュメントにもクロージャではないことが明記されていないため、非常にハマりやすい罠でした。
そもそもなんでこれがダメなの
JS でも Go でも Rust でも、近年よく使われる言語において、匿名関数は基本的にクロージャあり、上のようなコードは動くのが自然に思えます。
しかしながら、V 言語の匿名関数はクロージャではありません。
クロージャであることはあまりに当たり前なので、そもそも意味がわからない方も多いかもしれません。簡単に言えば上のコードは下のコードとほぼ等価になるということです。
fn anon_main_f() {
println(i)
}
fn main() {
i := 0
anon_main_f()
}
クロージャではないというのはこのようなことであり、このコードがコンパイルエラーになることがわかると思います。
V 言語のクロージャ
V 言語にはクロージャが存在しません。
はい。お気持ちはよくわかります。私も最初はマジか…と思いました。
map などでクロージャのようなものを使いたい場合、いったん struct を作るなどの工夫が必要になります(なお、現状では匿名構造体と関数内での構造体定義が未サポートなため、書くのはそれなりに面倒です)。
クロージャは今後サポートされる方向性ではあります。ただ、議論がそれほど進んでおらず、作者の Alex はじめコアコントリビューターもあまり意見を表明していないため、今後どうなるかは不明です。
Discussion
今はありますね。