Vim script の lambda で外部変数をキャプチャしたかった

Vim script の lambda で外部の変数を参照したかったのですが、どうやらこれはエラーになるみたいです。

function! s:main()
    let a = 3
    let F = { b -> a + b }
    echo F(2)
   " => E121: 未定義の変数です: a
endfunction
call s:main()

まあ :function で定義した関数もスコープ外の変数は参照できないからそういう挙動なのかな?

[回避方法]

こういう場合はカリー化、カリー化する。

function! s:main()
    let a = 3
    let F = function({ a, b -> a + b }, [a])
    echo F(2)
   " => 5
endfunction
call s:main()

この場合は参照ではなくてコピーになるので注意(後から a を変更してもカリー化後の関数には反映されない

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

  • 7.4.2067