proc CALCULATOR::digit_pressed define var val val = this.frame.calc_window.get_value() if val == 0 then val = this.digit else // each digit key on the calculator has a data // item in its context called 'digit' which is // assigned a number 0..9 corresponding to the // digit on the digit key being pressed val = $val + "%d":this.digit endif this.frame.calc_window.set_value(val) endproc proc CALCULATOR::point_pressed define var val val = this.frame.calc_window.get_value() val = $val + "." this.frame.calc_window.set_value(val) endproc proc CALCULATOR::op_pressed this.CALCULATOR::equal_pressed() define var val this.frame.acc = this.frame.calc_window.get_value() this.frame.calc_window.set_value(0) // each operator key on the calculator has a data // item in its context called 'op_type' which is // assigned a string corresponding to the operation // on the key being pressed. Valid string are // CALCULATOR::do_add // CALCULATOR::do_sub // CALCULATOR::do_mult // CALCULATOR::do_div this.frame.calc_op = this.op_type endproc proc CALCULATOR::equal_pressed define var val val = this.frame.calc_window.get_value() // the operation performed on the data was set up // by CALCULATOR::op_pressed and is the name of one // of the functions do_add, do_sub, do_mult or do_div val = (this.frame.calc_op)(float(this.frame.acc), float(val)) this.frame.calc_op = "do_null" this.frame.acc = 0 this.frame.calc_window.set_value(val) endproc proc CALCULATOR::do_add return @0 + @1 endproc proc CALCULATOR::do_sub return @0 - @1 endproc proc CALCULATOR::do_mult return @0 * @1 endproc proc CALCULATOR::do_div return @0 / @1 endproc proc CALCULATOR::do_null return @1 endproc proc CALCULATOR::ce_pressed // clear entry this.frame.calc_window.set_value(0) endproc proc CALCULATOR::ac_pressed // all clear this.frame.calc_window.set_value(0) this.frame.acc = 0 this.frame.calc_op = "do_null" endproc proc CALCULATOR::negate_pressed // the +/- key define var val val = this.frame.calc_window.get_value() val = 0 - float(val) this.frame.calc_window.set_value(val) endproc