Vim で無名関数を扱うプラグインをつくった
気がついたら結構本格的になってしまっていたのでいっそのことプラグイン化してようかと。
まぁ使い道があるのかわからないけども。
だいたいやりたいことはできた。
ちなみにプラグイン名はでちまるさんに考えてもらいました。
[簡単な使い方]
" 式を渡して、それを評価する関数の参照を返す let s:Func = reti#lambda("1 + 2") echo s:Func() " => 3 " 引数を評価する場合は a:{n} を使用する let s:Plus = reti#lambda("a:1 + 2") echo s:Plus(1) " => 3 " 二項演算子を受け取った場合はそれを評価する関数を返す let s:Minus = reti#lambda("-") echo s:Minus(3, 2) " => 1
[二項演算子を関数化]
" 二項演算子を受け取った場合はそれを評価する関数を返す let s:Minus = reti#lambda("-") echo s:Minus(3, 2) " => 1
[スクリプトローカルや関数ローカル変数のキャプチャ]
" s: や l: を渡すことで直接キャプチャ出来る let s:n = 4 let s:PlusN = reti#lambda("a:1 + n", s:) echo s:PlusN(6) " => 10 function! s:func() let n = 1 let m = 2 let Func = reti#lambda("n + m", l:) echo Func() " => 3 endfunction call s:func()
[副作用のある処理]
" 副作用がある処理は reti#execute を使用する let s:Func = reti#execute("echo a:1") call s:Func("homu") " => "homu" " 代入 let s:n = 2 let s:Func = reti#execute("let n += a:1", s:) call s:Func(4) echo s:n " => 6
と、まぁこんな感じです。
ここまで来るとユーザ定義演算子が欲しくなりますね…!
機能としてはだいたいやりたい事ができたので、次は評価の方法なんかを変えてみたいところ。