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