vim script で、Boost.Optional のような処理
前回作ったクラスの処理で Boost.Optional のような処理をやろうとすると、どんな感じになるのか試してみました。
Boost.Optional についてはここら辺を参照して下さい。
不正な値が含まれる場合に使用したりします。
[ソース]
function! s:optional(...) let self = s:class("optional") if a:0 > 0 let self.__bool__ = 1 let self.value = a:1 else let self.__bool__ = 0 endif function! self.get() return self.value endfunction return self endfunction let s:none = s:optional() function! s:sqrt(x) let x = a:x if x < 0 " 0 未満は不正な値として返す return s:none endif let i = 0 while i * i <= x let i = i + 1 endwhile return s:optional(i - 1) endfunction function! s:division(a, b) if a:b == 0 " ゼロ除算の場合は不正 return s:none endif return s:optional(a:a / a:b) endfunction function! s:optional_test() for var in range(-5, 5) let result = s:sqrt(var) if s:bool(result) echo result.get() else echo "invalid" endif endfor let result = s:division(4, 2) if s:bool(result) echo result.get() else echo "invalid" endif echo "" " ゼロ除算はエラー let result = s:division(4, 0) if s:bool(result) echo result.get() else echo "invalid" endif endfunction call s:optional_test()
[出力]
invalid invalid invalid invalid invalid 0 1 1 1 2 2 2 invalid
s:bool とかは前回作ったやつです。
うーん、毎回評価するのがちょっと手間ですかね。
さて、どうなんだろうか。