Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.62 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                (* dodawanie   *)
  6.        | SUB                (* odejmowanie *)
  7.        | MUL                (* mnozenie    *)
  8.        | SQR                (* podnoszenie do kwadratu *)
  9.        | PUSH of float;;     (* odkladanie na stos *)
  10.  
  11. type stack = float list
  12.  
  13.  
  14. exception BLEDNY_PROGRAM of (instruction * stack)
  15. let intInstr (x , y) =
  16.     match  x , y  with
  17.     | ADD, a::b::ys -> (b + a) :: ys : stack
  18.     | SUB, a::b::ys -> (b - a) :: ys
  19.     | MUL, a::b::ys -> (b * a) :: ys
  20.     | SQR, a::ys -> (a * a) :: ys
  21.     | PUSH x, ys -> x::ys
  22.     | _ , _ -> raise (BLEDNY_PROGRAM(x, y))
  23.  
  24. let intpProg(is) =
  25.   let rec iPS = function
  26.           | ([],x::xs) -> x  (* koniec listy instrukcji (obliczeń)
  27.                                 zwracany wierzchołek stosu         *)
  28.           | (i::is, xs) -> iPS(is, intInstr(i, xs))
  29.                              (* wykonanie pojedynczej instrukcji i *)
  30.   iPS(is,[])                 (* start programu, stos początkowo pusty *)
  31.  
  32. let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL]
  33.  
  34.  
  35.  
  36.  
  37. [<EntryPoint>]
  38. let main argv =
  39.     (*
  40.     let i1 = PUSH 3.0;
  41.     let i2 = PUSH 4.0;
  42.     let i3 = ADD;
  43.     let stos:stack = [];    
  44.     let stos1 =  intInstr(i1,stos);
  45.     let stos2 =  intInstr(i2,stos1);
  46.     let stos3 =  intInstr(i3,stos2);
  47.  
  48.     let stos:stack     =  [];
  49.     let it = intInstr(PUSH 5.0, stos)
  50.     let stos1    =  intInstr(PUSH 3.0,it);
  51.     let stos2 =  intInstr(ADD  ,stos1);  
  52.     *)
  53.     (*
  54.     let stos:stack  =  []
  55.     let stos1 =  intInstr(PUSH 3.0,stos);
  56.     let stos2 =  intInstr(ADD   ,stos1);  
  57.      (* tu jest zgłaszany wyjatek BLEDNY_ARGUMENT *)
  58.     *)
  59.     let stos:stack  = []
  60.     let stos1 =  intInstr(PUSH 3.0,stos);
  61.     let stos2 =  try intInstr(ADD ,stos1) with
  62.                                           BLEDNY_PROGRAM (a, b) ->
  63.                                           (
  64.                                             printf "Wyjątek: Błędne wykonanie
  65.    programu\nOperand: %A, Stos: %A" a b ;  
  66.                                             (* aktualna wartość stosu *)
  67.                                             b
  68.                                           );
  69.  
  70.  
  71. let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL]
  72. let il2 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0];      
  73. let il3 = [PUSH 3.0; PUSH 4.0; ADD; MUL];      
  74.  
  75. let w = intpProg(il1)
  76. printfn "%A" w
  77.  
  78.  
  79.     (*printfn "%A" stos2*)
  80.  
  81.  
  82.     printf "Naciśnij klawisz..."
  83.     ignore (System.Console.ReadKey(true))
  84.  
  85.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement