vim script で eval

vim script では eval 関数を使用して script の評価を行う事ができます。

[ソース]

function! s:lambda(expr)
    let self = {}
    let self.expr = a:expr
    function! self.apply(...)
        return eval(self.expr)
    endfunction
    return self
endfunction

function! s:main()
    
    " 数値を評価して返す
    echo eval("42")
    echo eval("22 + 20")
    
    " '' で囲めば文字列も評価できる
    echo eval("'hoge'.'foo'")

    let a = 10
    let b = 32
    " ローカル変数も使用できる
    echo eval("a + b")
    
    " こんな事も…!
    let plus_10 = s:lambda("map(a:1, 'v:val+10')")
    echo plus_10.apply([1, 2, 3])
    
    " ただし、ローカル変数は使えない
    let plus_a = s:lambda("map(a:1, 'v:val+a')")
    " 評価されるスコープが違うので、a が未定義になる
    " echo plus_a.apply([1, 2, 3])
endfunction
call s:main()

[出力]

42
42
hogefoo
42
[11, 12, 13]