Vim script でパターンマッチ的な書き方

なんか前も書いたような気がしますが、関数名にパターンを記述してゴニョゴニョします。

[ソース]

function! s:apply(expr, ...)
    let expr = a:expr."_".join(a:000, "_")
    return call(exists("*".expr) ? expr : a:expr, a:000)
endfunction

function! s:fact_1(...)
    return 1
endfunction

function! s:fact(n)
    return a:n * s:apply("s:fact", a:n-1)
endfunction

echo s:fact(4)


function! s:fizzbuzz_0_0(value)
    echo a:value
endfunction

function! s:fizzbuzz_1_0(...)
    echo "Fizz"
endfunction

function! s:fizzbuzz_0_1(...)
    echo "Buzz"
endfunction

function! s:fizzbuzz_1_1(...)
    echo "FizzBuzz"
endfunction

for v in range(1, 30)
    call function("s:fizzbuzz_".(v%3==0)."_".(v%5==0))(v)
endfor

[出力]

24
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz


整数であれば、これでもいいかも知れませんが、それ以外([]とか)だと無理なので悩ましい。
やはり呼び出し側でもうちょっと工夫する必要がありますねぇー。