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

×=等の機能をいれる前は=ボタンは演算ボタンと似たようなもの―というよりは=ボタンはget2ndと結びつけられた演算ボタンでした。
別扱いにしていたのはいずれ異なる機能を持つことがわかっていたからです。
んで、=ボタン用の関数は他の演算ボタンと同じようにmake-op*1で生成していました
つまり=ボタンの機能は演算ボタン用の関数内で実装していたわけです。
そして+=、-=、×=、÷=の機能をいれたときも元々あった処理は演算ボタン用の関数内に残して=用の関数から呼び出すようにし、新たな機能のみ=用の関数内に直接書いたのでした。
しかし、これは役割分担のし方としては少し複雑なので次のように変えます。

  • =ボタン用の関数: 最後に指定された演算を実行する
  • 演算ボタン用の関数: 次に行う演算を指定する

そして演算ボタンで演算を実行する必要がある場合は演算ボタン用の関数から=ボタン用の関数を呼び出すようにします。

(define (make-op-func i)
  (lambda ()
    (and (symbol=? error-type nothing)
         (begin (or (symbol=? mode waiting) (input=))
                (or (symbol=? error-type non-recov) (set! op-no i))))))

(define (input=)
  (and (symbol=? error-type nothing)
       (begin (and (symbol=? mode waiting) (set! input result))
              (set! result ((list-ref ops op-no) result input))
              (check-overflow!) (set! window result) (set! op-no 0)
              (set! mode waiting))))

続きます。

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

*1:opはaddとかsubとかを指すのに使っている名前で、この関数はaddとかsubとかを作らないので今している変更のついでにmake-op-funcに名前を変えました。