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 とかは前回作ったやつです。
うーん、毎回評価するのがちょっと手間ですかね。
さて、どうなんだろうか。