Advertisement
Guest User

racket calculator

a guest
Mar 28th, 2013
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 6.33 KB | None | 0 0
  1. #lang racket/gui
  2.  
  3. (define-struct state (n1 n2 op))
  4. (define my-state (make-state null null null))
  5.  
  6. (define (add-num s num)
  7.   (cond
  8.     [(null? (state-n1 s)) (set! my-state (make-state (string->number num) null null))]
  9.     [else (set! my-state (make-state (state-n1 s) (string->number num) (state-op s)))]
  10.     ))
  11.  
  12. (define (add-op s op)
  13.   (cond
  14.     [(not (null? (state-n1 s))) (set! my-state (make-state (state-n1 s) (state-n2 s) op))]))
  15.  
  16. (define (calculate)
  17.   (if (and (not(null? (state-n1 my-state))) (not(null? (state-n2 my-state))) (not(null? (state-op my-state))))
  18.   (send editor insert (number->string ((state-op my-state) (state-n1 my-state) (state-n2 my-state))))
  19.   "error"))
  20.  
  21. (define frame (new frame%
  22.                    
  23.                    ; Do not allow the frame to be resized.
  24.                    [stretchable-width #f]
  25.                    [stretchable-height #f]
  26.                    [label "Calculator"]
  27.                    [min-width 200]
  28.                    [min-height 150]
  29.                    ))
  30. (define my-font (make-object font% 26 'modern))
  31. (define text (new text-field%
  32.                   [label ""]
  33.                   [min-height 50]
  34.                   [min-width 258]
  35.                   [parent frame]
  36.                   [font my-font]
  37.                   [enabled #f]))
  38.  
  39. (define editor (send text get-editor))
  40.  
  41. (define (clear-text)
  42.   (send editor delete 0 (string-length (send editor get-text))))
  43.  
  44.  
  45.  
  46. (send editor set-padding
  47.       225 ;left padding
  48.       0 ;top padding
  49.       0 ;right padding
  50.       0 ;bottom padding
  51.       )
  52.  
  53.  
  54. (define hcontainer (new horizontal-panel% [parent frame]))
  55. (define num-buttons (new vertical-panel% [parent hcontainer]))
  56. (define equal-clear (new vertical-panel% [parent hcontainer]))
  57.                  
  58.  
  59. (define third-row (new horizontal-panel% [parent num-buttons]))
  60. (define second-row (new horizontal-panel% [parent num-buttons]))
  61. (define first-row (new horizontal-panel% [parent num-buttons]))
  62. (define zero-row (new horizontal-panel% [parent num-buttons]))
  63.  
  64.  
  65. (define zero (new button%
  66.                  [label "0"]
  67.                  [parent zero-row]
  68.                  [min-width 104]
  69.                  [min-height 50]
  70.                  [callback (lambda (b e) (send editor insert "0"))]
  71.                  ))
  72.  
  73.  
  74. (define decimal (new button%
  75.                  [label "."]              
  76.                  [parent zero-row]
  77.                  [min-width 50]
  78.                  [min-height 50]
  79.                  [callback (lambda (b e) (send editor insert "."))]
  80.                  ))
  81.  
  82.  
  83.  
  84. (define one (new button%
  85.                  [label "1"]
  86.                  [parent first-row]
  87.                  [min-width 50]
  88.                  [min-height 50]
  89.                  [callback (lambda (b e) (send editor insert "1"))]))
  90.                  
  91. (define two (new button%
  92.                  [label "2"]
  93.                  [parent first-row]
  94.                  [min-width 50]
  95.                  [min-height 50]
  96.                  [callback (lambda (b e) (send editor insert "2"))]
  97.                  ))
  98.  
  99. (define three (new button%
  100.                  [label "3"]
  101.                  [parent first-row]
  102.                  [min-width 50]
  103.                  [min-height 50]
  104.                  [callback (lambda (b e) (send editor insert "3"))]
  105.                  ))
  106.  
  107. (define four (new button%
  108.                  [label "4"]
  109.                  [parent second-row]
  110.                  [min-width 50]
  111.                  [min-height 50]
  112.                  [callback (lambda (b e) (send editor insert "4"))]
  113.                  ))
  114.  
  115. (define five (new button%
  116.                  [label "5"]
  117.                  [parent second-row]
  118.                  [min-width 50]
  119.                  [min-height 50]
  120.                  [callback (lambda (b e) (send editor insert "5"))]
  121.                  ))
  122.  
  123. (define six (new button%
  124.                  [label "6"]
  125.                  [parent second-row]
  126.                  [min-width 50]
  127.                  [min-height 50]
  128.                  [callback (lambda (b e) (send editor insert "6"))]
  129.                  ))
  130.  
  131. (define seven (new button%
  132.                  [label "7"]
  133.                  [parent third-row]
  134.                  [min-width 50]
  135.                  [min-height 50]
  136.                  [callback (lambda (b e) (send editor insert "7"))]
  137.                  ))
  138.  
  139. (define eight (new button%
  140.                  [label "8"]
  141.                  [parent third-row]
  142.                  [min-width 50]
  143.                  [min-height 50]
  144.                  [callback (lambda (b e) (send editor insert "8"))]
  145.                  ))
  146.  
  147. (define nine (new button%
  148.                  [label "9"]
  149.                  [parent third-row]
  150.                  [min-width 50]
  151.                  [min-height 50]
  152.                  [callback (lambda (b e) (send editor insert "9"))]
  153.                  ))
  154.  
  155. (define plus (new button%
  156.                   [label "+"]
  157.                   [parent zero-row]
  158.                   [min-width 50]
  159.                   [min-height 50]
  160.                   [callback (lambda (b e) (add-num my-state (send editor get-text))
  161.                               (add-op my-state +)
  162.                               (clear-text))]))
  163.  
  164. (define clear (new button%
  165.                    [label "Clr"]
  166.                    [parent equal-clear]
  167.                    [min-width 50]
  168.                    [min-height 104]
  169.                    [callback (lambda (b e) (clear-text)
  170.                                (set! my-state (make-state null null null)))]))
  171.  
  172. (define equals (new button%
  173.                     [label "="]
  174.                     [parent equal-clear]
  175.                     [min-width 50]
  176.                     [min-height 104]
  177.                     [callback (lambda (b e) (add-num my-state (send editor get-text))
  178.                                 (clear-text)
  179.                                 (calculate))]))
  180.  
  181. (define minus (new button%
  182.                    [label "-"]
  183.                    [parent first-row]
  184.                    [min-width 50]
  185.                    [min-height 50]))
  186. (define times (new button%
  187.                    [label "*"]
  188.                    [parent second-row]
  189.                    [min-width 50]
  190.                    [min-height 50]))
  191.  
  192. (define division (new button%
  193.                       [label "/"]
  194.                       [parent third-row]
  195.                       [min-width 50]
  196.                       [min-height 50]))
  197.  
  198. ; Display the frame
  199. (send frame show #t)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement