Simple Scheme で電卓をつくってみる(7)

=を実装しましょう。
=が押されると、それまでの計算結果と最後に入力された数に対して最後の数の入力直前に押された演算ボタンの演算が適用されます*1
演算ボタンとほとんど同じ機能ですが、=に割り当てられた演算は特にありません。というわけで基本は他の演算ボタンと同じ内容で、opに関しては初期化するようにすればいいわけですね。ところで、今、opの初期値はaddです。ということは=ボタンは+ボタンと同じということですね。

(define (input=)
  (begin (and (symbol=? mode inputting)
              (begin (set! result (op result input)) (set! window result)))
         (set! op add) (set! mode waiting)))

それじゃ困るので、初期値を別の関数に変更します。第2引数を返す射影関数でよいですね。

(define (get2nd x y) y)
(define op get2nd)

(define (input=)
  (begin (and (symbol=? mode inputting)
              (begin (set! result (op result input)) (set! window result)))
         (set! op get2nd) (set! mode waiting)))

=が押せると心理的に落ち着きますね(*´ω`*)

続いてクリアボタンを作りましょう。
ACとCの2つがありますね。
ACは完全に初期化するボタンです。

(define (inputAC)
  (begin (set! op get2nd) (set! result zero) (set! window result)
         (set! mode waiting)))

よく見るとinputの初期化を忘れてますが、inputは次に書き替わるまで多分参照されないので問題ないです( ・∀・)

Cボタンは、数の入力中に押されると入力中の数だけを取り消します。
それ以外のときに押された場合はACと同じです*2

(define (inputC)
  (if (symbol=? mode inputting)
      (begin (set! which-part 'int) (set! input zero) (set! window input))
      (inputAC)))

続きます。

(ここまでのソースコード)

*1:機能はほかにもありますがあと回しにします。

*2:メモリに保存された数値はCでは消えないので最終的な挙動は異なりますが今のところ同じです。