読者です 読者をやめる 読者になる 読者になる

Vim script の closure が利用できるケース

前回Vim script の closure は使うべきではない』と言ってたんですが、次のようなコードだと結構有効的だと思います。

function! s:init(value)
    let value = a:value

   " 初期値に基づいて関数を定義する
    function! s:hoge() closure
        return value + value
    endfunction

    function! s:bar(value) closure
        return value + a:value
    endfunction
endfunction

" 任意の値で初期化して関数を定義する
call s:init(42)

echo s:hoge()
" => 84
echo s:bar(-20)
" => 22

" 任意の値で関数を書き換える
call s:init(-4)
echo s:hoge()
" => -8
echo s:bar(-20)
" => -24

関数内で関数を定義したいときに closure を利用して関数外の変数を参照しています。 要は『意図して関数を上書きしてる』ようなコードですね。 あまりこのような『関数内で関数を定義する』コードは見かけないんですが、こういう風に closure を利用して関数を定義すると『スクリプトローカル変数』を隠蔽することが可能になります。 例えば、closure を使わない場合は、次のように『スクリプトローカル変数』を使わなければなりません。

function! s:init(value)
   " 関数から参照するためにスクリプトローカル変数を定義する
    let s:value = a:value

    function! s:hoge()
        return s:value + s:value
    endfunction

    function! s:bar(value)
        return s:value + a:value
    endfunction
endfunction

スクリプトローカル変数を回避する』のであれば確かに closure はかなり強力な機能であると思う。