Vim script で match 文みたいな構文
一応、昨日の続きです。
Vim script で match 文みたいな構文を書いてみました。
[ソース]
function! s:match(...) let self = {} let self.key = string(a:1) let self.map = {} function! self.case(val, expr) let self.map[string(a:val)] = a:expr return self endfunction function! self.default(val) try return self.apply() catch return a:val endtry endfunction function! self.apply() return self.eval(self.map[self.key]) endfunction function! self.eval(expr) return a:expr endfunction return self endfunction function! s:main() for n in range(1, 30) echo s:match([n%3==0, n%5==0]) \.case([1,0], "Fizz") \.case([0,1], "Buzz") \.case([1,1], "FizzBuzz") \.default(n) endfor endfunction call s:main()
[出力]
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
チェーンメソッドで記述して、なんとなくそれっぽい感じにはなっていると思います。
最後に apply を呼ぶのがめんどくさかったので、default() 内で match 文の評価を行っています。
しかし、改行毎に \ を書くのが若干手間なのと、式を評価できないのがちと悲しいですね…。
まぁ簡単な式であれば、文字列で定義して、eval や execute で評価してもいいんですけども。
もっといい書き方があるかしら。
あと case 以外にも type とかがあってもいいかな。