Hack #167: Vimスクリプトで無名関数やクロージャを使う方法
Posted at 2010/08/13ツイート
無名関数
function! s:foo()
let foo = {}
function foo.funcall() dict
echo 'lambda'
endfunction
return foo
endfunction
call s:foo().funcall()
クロージャ
function! s:foo(num)
let foo = {'i': a:num}
function foo.funcall() dict
let self.i += 1
return self.i
endfunction
return foo
endfunction
echo s:foo(1).funcall()
let s:clos = s:foo(5)
" 6
echo s:clos.funcall()
" 7
echo s:clos.funcall()
" 8
echo s:clos.funcall()
説明
Vimスクリプトでは辞書型に関数をキーとして代入することができます。
その場合関数はほぼ無名のような存在になります。
また辞書型に格納した「dict」つきの関数からはその辞書を「self」という変数で参照できるので
辞書に関数内で使う変数などを辞書に保存しておけば関数内からその変数を参照できる、いわば疑似的なクロージャを実現することができます。
- 自分で変数を渡す必要がある
- obj.funcall() を自分で呼ぶ必要がある
などなど他言語と比べかなりプリミティブですが、これを駆使すればVimスクリプトでも現実的に無名関数やクロージャが扱えることがわかるでしょう。
またVimスクリプトでは辞書型を使ったプロトタイプ指向によりクラスなども扱うことができます。
そこまでしなくても辞書型を活用することでモジュールを分けられるのでいろんな活用方法があります。
もどる
blog comments powered by Disqus