🦈

V 言語にはクロージャがない。

2021/01/22に公開1

前置き

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 はじめコアコントリビューターもあまり意見を表明していないため、今後どうなるかは不明です。

リンク

脚注
  1. #8232 ↩︎

Discussion