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

こんな感じで、関数名に各引数の型名を記述します。
関数の呼び出し方が手間ですが、まぁありかなー。
もうちょっと改良したい。