Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #lang racket/gui
- (define-struct state (n1 n2 op))
- (define my-state (make-state null null null))
- (define (add-num s num)
- (cond
- [(null? (state-n1 s)) (set! my-state (make-state (string->number num) null null))]
- [else (set! my-state (make-state (state-n1 s) (string->number num) (state-op s)))]
- ))
- (define (add-op s op)
- (cond
- [(not (null? (state-n1 s))) (set! my-state (make-state (state-n1 s) (state-n2 s) op))]))
- (define (calculate)
- (if (and (not(null? (state-n1 my-state))) (not(null? (state-n2 my-state))) (not(null? (state-op my-state))))
- (send editor insert (number->string ((state-op my-state) (state-n1 my-state) (state-n2 my-state))))
- "error"))
- (define frame (new frame%
- ; Do not allow the frame to be resized.
- [stretchable-width #f]
- [stretchable-height #f]
- [label "Calculator"]
- [min-width 200]
- [min-height 150]
- ))
- (define my-font (make-object font% 26 'modern))
- (define text (new text-field%
- [label ""]
- [min-height 50]
- [min-width 258]
- [parent frame]
- [font my-font]
- [enabled #f]))
- (define editor (send text get-editor))
- (define (clear-text)
- (send editor delete 0 (string-length (send editor get-text))))
- (send editor set-padding
- 225 ;left padding
- 0 ;top padding
- 0 ;right padding
- 0 ;bottom padding
- )
- (define hcontainer (new horizontal-panel% [parent frame]))
- (define num-buttons (new vertical-panel% [parent hcontainer]))
- (define equal-clear (new vertical-panel% [parent hcontainer]))
- (define third-row (new horizontal-panel% [parent num-buttons]))
- (define second-row (new horizontal-panel% [parent num-buttons]))
- (define first-row (new horizontal-panel% [parent num-buttons]))
- (define zero-row (new horizontal-panel% [parent num-buttons]))
- (define zero (new button%
- [label "0"]
- [parent zero-row]
- [min-width 104]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "0"))]
- ))
- (define decimal (new button%
- [label "."]
- [parent zero-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "."))]
- ))
- (define one (new button%
- [label "1"]
- [parent first-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "1"))]))
- (define two (new button%
- [label "2"]
- [parent first-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "2"))]
- ))
- (define three (new button%
- [label "3"]
- [parent first-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "3"))]
- ))
- (define four (new button%
- [label "4"]
- [parent second-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "4"))]
- ))
- (define five (new button%
- [label "5"]
- [parent second-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "5"))]
- ))
- (define six (new button%
- [label "6"]
- [parent second-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "6"))]
- ))
- (define seven (new button%
- [label "7"]
- [parent third-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "7"))]
- ))
- (define eight (new button%
- [label "8"]
- [parent third-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "8"))]
- ))
- (define nine (new button%
- [label "9"]
- [parent third-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (send editor insert "9"))]
- ))
- (define plus (new button%
- [label "+"]
- [parent zero-row]
- [min-width 50]
- [min-height 50]
- [callback (lambda (b e) (add-num my-state (send editor get-text))
- (add-op my-state +)
- (clear-text))]))
- (define clear (new button%
- [label "Clr"]
- [parent equal-clear]
- [min-width 50]
- [min-height 104]
- [callback (lambda (b e) (clear-text)
- (set! my-state (make-state null null null)))]))
- (define equals (new button%
- [label "="]
- [parent equal-clear]
- [min-width 50]
- [min-height 104]
- [callback (lambda (b e) (add-num my-state (send editor get-text))
- (clear-text)
- (calculate))]))
- (define minus (new button%
- [label "-"]
- [parent first-row]
- [min-width 50]
- [min-height 50]))
- (define times (new button%
- [label "*"]
- [parent second-row]
- [min-width 50]
- [min-height 50]))
- (define division (new button%
- [label "/"]
- [parent third-row]
- [min-width 50]
- [min-height 50]))
- ; Display the frame
- (send frame show #t)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement