ローカル変数を関数ローカルに展開する

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 さん、ありがとうございましたー。