main.ml
· 3.0 KiB · OCaml
Raw
Playground
open Bogue
module W = Widget
module L = Layout
let calculator () =
let stack = Stack.create () in
Stack.push "0" stack ;
let stack_show () =
Stack.fold (fun acc number -> number ^ " " ^ acc) "" stack in
let display = W.label "" in
let update_display () =
W.set_text display (stack_show ()) in
let digit_pressed digit =
match Stack.pop stack with
| "0" -> Stack.push digit stack ;
| number -> Stack.push (number ^ digit) stack ;
update_display () in
let push_clicked _ =
Stack.push "0" stack ;
update_display () in
let swap_clicked _ =
match Stack.length stack with
| 2 ->
let y = Stack.pop stack in
let x = Stack.pop stack in
Stack.push y stack ;
Stack.push x stack ;
update_display ()
| _ -> () in
let pop_clicked _ =
match Stack.length stack with
| 1 ->
Stack.pop stack |> ignore ;
Stack.push "0" stack ;
update_display ()
| _ ->
Stack.pop stack |> ignore ;
update_display () in
let digit_clicked digit = fun _ ->
digit_pressed digit ;
update_display () in
let op_clicked op = fun _ ->
match Stack.length stack with
| 2 ->
let y = Stack.pop stack |> int_of_string in
let x = Stack.pop stack |> int_of_string in
Stack.push (op x y |> string_of_int) stack ;
update_display ()
| _ -> () in
let op_button name op =
let button = W.button name in
W.on_click ~click:(op_clicked op) button ;
button in
let push_button () =
let button = W.button "PSH" in
W.on_click ~click:push_clicked button ;
button in
let swap_button () =
let button = W.button "SWP" in
W.on_click ~click:swap_clicked button ;
button in
let pop_button () =
let button = W.button "POP" in
W.on_click ~click:pop_clicked button ;
button in
let digit_button digit =
let button = W.button digit in
W.on_click ~click:(digit_clicked digit) button ;
button in
let layout = L.tower ~align:Draw.Center [
L.resident ~w:400 display ;
L.flat_of_w [ digit_button "1" ; digit_button "2" ; digit_button "3" ] ;
L.flat_of_w [ digit_button "4" ; digit_button "5" ; digit_button "6" ] ;
L.flat_of_w [ digit_button "7" ; digit_button "8" ; digit_button "9" ] ;
L.flat_of_w [ digit_button "0" ] ;
L.flat_of_w [ push_button () ; swap_button () ; pop_button () ] ;
L.flat_of_w [ op_button "ADD" (+) ; op_button "MUL" ( * ) ; op_button "SUB" (-) ; op_button "DIV" (/) ] ;
] in
let calculator = Bogue.make [] [layout] in
update_display () ;
Bogue.run calculator ;;
let _ =
calculator () ;
Draw.quit()
| 1 | open Bogue |
| 2 | |
| 3 | module W = Widget |
| 4 | module L = Layout |
| 5 | |
| 6 | |
| 7 | let calculator () = |
| 8 | let stack = Stack.create () in |
| 9 | Stack.push "0" stack ; |
| 10 | |
| 11 | let stack_show () = |
| 12 | Stack.fold (fun acc number -> number ^ " " ^ acc) "" stack in |
| 13 | |
| 14 | let display = W.label "" in |
| 15 | let update_display () = |
| 16 | W.set_text display (stack_show ()) in |
| 17 | |
| 18 | let digit_pressed digit = |
| 19 | match Stack.pop stack with |
| 20 | | "0" -> Stack.push digit stack ; |
| 21 | | number -> Stack.push (number ^ digit) stack ; |
| 22 | update_display () in |
| 23 | |
| 24 | let push_clicked _ = |
| 25 | Stack.push "0" stack ; |
| 26 | update_display () in |
| 27 | |
| 28 | let swap_clicked _ = |
| 29 | match Stack.length stack with |
| 30 | | 2 -> |
| 31 | let y = Stack.pop stack in |
| 32 | let x = Stack.pop stack in |
| 33 | Stack.push y stack ; |
| 34 | Stack.push x stack ; |
| 35 | update_display () |
| 36 | | _ -> () in |
| 37 | |
| 38 | let pop_clicked _ = |
| 39 | match Stack.length stack with |
| 40 | | 1 -> |
| 41 | Stack.pop stack |> ignore ; |
| 42 | Stack.push "0" stack ; |
| 43 | update_display () |
| 44 | | _ -> |
| 45 | Stack.pop stack |> ignore ; |
| 46 | update_display () in |
| 47 | |
| 48 | let digit_clicked digit = fun _ -> |
| 49 | digit_pressed digit ; |
| 50 | update_display () in |
| 51 | |
| 52 | let op_clicked op = fun _ -> |
| 53 | match Stack.length stack with |
| 54 | | 2 -> |
| 55 | let y = Stack.pop stack |> int_of_string in |
| 56 | let x = Stack.pop stack |> int_of_string in |
| 57 | Stack.push (op x y |> string_of_int) stack ; |
| 58 | update_display () |
| 59 | | _ -> () in |
| 60 | |
| 61 | let op_button name op = |
| 62 | let button = W.button name in |
| 63 | W.on_click ~click:(op_clicked op) button ; |
| 64 | button in |
| 65 | |
| 66 | let push_button () = |
| 67 | let button = W.button "PSH" in |
| 68 | W.on_click ~click:push_clicked button ; |
| 69 | button in |
| 70 | |
| 71 | let swap_button () = |
| 72 | let button = W.button "SWP" in |
| 73 | W.on_click ~click:swap_clicked button ; |
| 74 | button in |
| 75 | |
| 76 | let pop_button () = |
| 77 | let button = W.button "POP" in |
| 78 | W.on_click ~click:pop_clicked button ; |
| 79 | button in |
| 80 | |
| 81 | let digit_button digit = |
| 82 | let button = W.button digit in |
| 83 | W.on_click ~click:(digit_clicked digit) button ; |
| 84 | button in |
| 85 | |
| 86 | let layout = L.tower ~align:Draw.Center [ |
| 87 | L.resident ~w:400 display ; |
| 88 | L.flat_of_w [ digit_button "1" ; digit_button "2" ; digit_button "3" ] ; |
| 89 | L.flat_of_w [ digit_button "4" ; digit_button "5" ; digit_button "6" ] ; |
| 90 | L.flat_of_w [ digit_button "7" ; digit_button "8" ; digit_button "9" ] ; |
| 91 | L.flat_of_w [ digit_button "0" ] ; |
| 92 | L.flat_of_w [ push_button () ; swap_button () ; pop_button () ] ; |
| 93 | L.flat_of_w [ op_button "ADD" (+) ; op_button "MUL" ( * ) ; op_button "SUB" (-) ; op_button "DIV" (/) ] ; |
| 94 | ] in |
| 95 | |
| 96 | let calculator = Bogue.make [] [layout] in |
| 97 | update_display () ; |
| 98 | Bogue.run calculator ;; |
| 99 | |
| 100 | let _ = |
| 101 | calculator () ; |
| 102 | Draw.quit() |
| 103 |