ローカル変数を関数ローカルに展開する
id:thinca さんに vim script の黒魔術を教えてもらったので覚え書き。
確かにやってみるとその通りなんだけども……多分教えてもらわなかったら絶対に気づかなかった。
[ソール]
function! s:map(list, expr, ...) echo l: call map(copy(a:000), "extend(l:, v:val)") echo l: return map(a:list, a:expr) endfunction function! s:hoge() let value = 10 let array = [0, 4, 2, 1] let pi = 3.14 echo l: echo s:map(array, "v:val + value", l:) endfunction call s:hoge()
[出力]
{'pi': 3.14, 'array': [0, 4, 2, 1], 'value': 10} {} {'pi': 3.14, 'array': [0, 4, 2, 1], 'value': 10} [10, 14, 12, 11]
l: はスコープのローカル変数がすべて入った辞書なのでこんな事が出来るみたいです。
やっている事は、s:hoge のローカル変数を s:map 関数内のローカル変数に追加しているだけですね。
l: 以外にも g: s: b: w: t: a: とかが使えるみたいですね。
vim script こわい。
そんな感じで、id:thinca さん、ありがとうございましたー。