vim script で、関数のオーバーロードっぽい定義
vim script では、次のように {} 内を評価して変数名を定義することが出来ます。
let s:hoge = "foo" let s:foo{s:hoge} = "foofoo" echo s:foo{s:hoge} " => foofoo echo s:foofoo " => foofoo
これは変数名だけではなく、関数名にも適用することが出来ます。
let s:hoge = "foo" function! s:func_{s:hoge}() echo "func_foo" endfunction call s:func_foo() " => func_foo
で、これを応用して、関数のオーバーロードのような定義を書いてみました。
[ソース]
let int = type(0) let string = type("") " int のみ function! s:disp{int}(value) echo "int:".string(a:value) endfunction " string のみ function! s:disp{string}(value) echo "string:".a:value endfunction function! s:disp(value) return s:disp{type(a:value)}(a:value) endfunction " int + int function! s:plus{int}_{int}(a, b) return a:a + a:b endfunction " string + string function! s:plus{string}_{string}(a, b) return a:a.a:b endfunction function! s:plus(a, b) return s:plus{type(a:a)}_{type(a:b)}(a:a, a:b) endfunction call s:disp(10) call s:disp("hoge") echo s:plus(2, 1) echo s:plus("hoge", "foo") " 定義されてないので NG " echo s:plus("hoge", 10)
[出力]
int:10 string:hoge 3 hogefoo
こんな感じで、関数名に各引数の型名を記述します。
関数の呼び出し方が手間ですが、まぁありかなー。
もうちょっと改良したい。