Ruby Cadet Club #3

Original 1999-02-20, by guel

[ruby] RPN 電卓 3版

先の例でクラスを作ったメリットはあまりなかったのですが、もうすこし
複雑になってくるとメリットがでてきます。

そこで先の電卓に関数電卓の機能を付けてみました。

メインループもクラス定義も、非常にそれぞれ均質なコードになっています。
均質なコードはバグが入りにくいと、経験上言えますし、
見た目がすっきりサワヤカなスクリプトは、私の趣味にぴったりします。

Perl はゼンゼンすっきりしないモノね。:-P



# --------------------------------------------------------- rpn3.rb ^

print "RPN CALC #3 of ruby, ready.    by guel  02/20/99\n"


class RpnCalc < Array
        include Math
        def set(x)
                push x.to_f
        end
        def add
                push pop + pop
        end
        def multi
                push pop * pop
        end
        def sub
                push (-pop + pop)
        end
        def div
                push 1 / pop / pop
        end
        def set_PI
                push PI
        end
        def set_E
                push E
        end
        def sin
                push super(pop)
        end
        def cos
                push super(pop)
        end
        def exp
                push super(pop)
        end
        def log
                push super(pop)
        end
        def log10
                push super(pop)
        end
        def sqrt
                push super(pop)
        end
        def reciprocal
                push 1 / pop
        end
        def power
                push pop ** pop
        end
        def CLR
                pop
        end
        def AllCLR
                clear
        end
end

rpncalc = RpnCalc.new

IS_NUM = /^\-?\d*(\.\d+)?(e(\+|\-)?\d*)?$/
#        符号、整数部、小数部、指数部


while gets
        split.each do |x|
        begin
                case x
                        when IS_NUM
                                rpncalc.set x
                        when 'pi'
                                rpncalc.set_PI
                        when 'e'
                                rpncalc.set_E
                        when '+'
                                rpncalc.add
                        when '*'
                                rpncalc.multi
                        when '-'
                                rpncalc.sub
                        when '/'
                                rpncalc.div
                        when 'sin'
                                rpncalc.sin
                        when 'cos'
                                rpncalc.cos
                        when 'tan'
                                rpncalc.tan
                        when 'exp'
                                rpncalc.exp
                        when 'log'
                                rpncalc.log
                        when 'log10'
                                rpncalc.log10
                        when 'sqrt'
                                rpncalc.sqrt
                        when '1/x'
                                rpncalc.reciprocal
                        when '^', '**'
                                rpncalc.power
                        when 'c', 'del'
                                rpncalc.CLR
                        when 'ac', 'reset'
                                rpncalc.AllCLR
                        else
                                print "入力がヘンだぜ (^^;\n"
                                p x
                end
        rescue
                print "例外処理が発生!!\n"
                p $!
                p $@
        end
        end
        p rpncalc
end

# --------------------------------------------------------- rpn3.rb $



Count ->

update 1999-11-27, since 1999-11-27
Copyright (c) 1999
by guel. All rights reserved.