Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.10 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.org
  2. // See the 'F# Tutorial' project for more help.
  3.  
  4. type instruction =
  5.     | ADD
  6.     | SUB
  7.     | MUL
  8.     | SQR
  9.     | DIV
  10.     | PUSH of float
  11.  
  12. type stack = float list
  13.  
  14. exception BLEDNY_PROGRAM of (instruction * stack)
  15.  
  16. let intInstr (x, y) =
  17.     match x, y with
  18.     | ADD, a::b::ys -> (b + a) :: ys : stack
  19.     | SUB, a::b::ys -> (b - a) :: ys
  20.     | MUL, a::b::ys -> (b * a) :: ys
  21.     | DIV, a::b::ys -> try
  22.                         (b / a) :: ys with
  23.                         | :? System.DivideByZeroException as a -> printfn "Dzielenie przez zero: %s" a.Message; ys;
  24.     | SQR, a::ys -> (a * a) :: ys
  25.     | PUSH x, ys -> x::ys
  26.     | _, _ -> raise (BLEDNY_PROGRAM(x, y));
  27.  
  28. let wypisz_instr = function
  29.     | ( PUSH x) -> "PUSH " + System.Convert.ToString(x)
  30.     | ( SQR ) -> " SQR "
  31.     | ( ADD ) -> " ADD "
  32.     | ( SUB ) -> " SUB "
  33.     | ( MUL ) -> " MUL ";
  34.  
  35. let intpProg(is) =
  36.     let rec iPS = function
  37.         | ([],x::xs) -> x
  38.         | (i::is, xs) -> iPS(is, intInstr(i, xs))
  39.  
  40.     iPS(is, [])
  41.  
  42. [<EntryPoint>]
  43. let main argv =
  44.     //let i1 = PUSH 3.0;
  45.     //let i2 = PUSH 4.0;
  46.     //let i3 = SUB;
  47.     //let i4 = PUSH 2.0;
  48.     //let i5 = MUL;
  49.     //let stos:stack = [];
  50.     //let stos1 = try intInstr(SQR, stos) with BLEDNY_PROGRAM(a, b) ->
  51.     //                                         (
  52.     //                                            printf "Wyjątek: Błędne wykonanie programu\nOperand: %A, Stos: %A" a b;
  53.     //                                            b
  54.     //                                            );
  55.     ////let stos2 = intInstr(ADD, stos1);
  56.     //let stos1 = intInstr(i1, stos);
  57.     //let stos2 = intInstr(i2, stos1);
  58.     //let stos3 = intInstr(i3, stos2);
  59.     //let stos4 = intInstr(i4, stos3);
  60.     //let stos5 = intInstr(i5, stos4);
  61.     let il1 = [PUSH 3.0; PUSH 0.0; DIV]
  62.     let il2 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0];
  63.     let il3 = [PUSH 3.0; PUSH 4.0; ADD; MUL];
  64.  
  65.     //let w = intpProg(il3)
  66.     //printfn "%A" (wypisz_instr MUL)
  67.  
  68.     printfn "%A" (intpProg il1);
  69.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement