Vim script の lambda 内で定義した変数のスコープ

Vim script の lmabda 内で変数を定義した場合、スコープがどうなるのかを調べてみました。 また、変数の定義には execute() を利用します。

[ローカル変数]

function! s:main()
    let F = { a -> [execute("let l:val = a"), l:val][-1] }
   " or let F = { a -> [execute("let val = a"), val][-1] }

    echo F(42)
   " => 42
    echo l:val
   " Error: E121: 未定義の変数です: l:val
endfunction
call s:main()

ローカル変数を定義した場合は、lambda 内でのみ参照することが出来ます。

[グローバル変数]

[lambda の定義]

let F = { a -> execute("let g:val = a") }
function! Disp()
    echo g:val
endfunction

[test.vim]

call F(42)
echo g:a
" => 42

echo Get()
" => 42

function! s:func()
    call F(3.14)
endfunction
echo g:a
" => 42

echo Get()
" => 42

グローバル変数の場合はそのままグローバル変数として定義されます。

[スクリプトローカル変数]

[lambda の定義]

let F = { a -> execute("let s:val = a") }
function! Disp()
    echo s:val
endfunction

[test.vim]

call F(42)
echo Get()
" => 42

echo s:val
" Error: E121: 未定義の変数です: s:val

スクリプトローカル変数の場合は、lambda を定義したスクリプトファイルのスクリプトローカル変数として定義されます。

[まとめ]

こんな感じで調べてみましたが基本的には :function で定義した場合と変わりはなさそうですね。

[使用した vim のバージョン]

  • 7.4.2067