Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Learn more about F# at http://fsharp.org
- // See the 'F# Tutorial' project for more help.
- type instruction =
- | ADD
- | SUB
- | MUL
- | SQR
- | DIV
- | PUSH of float
- type stack = float list
- exception BLEDNY_PROGRAM of (instruction * stack);
- let intInstr (x, y) =
- match x , y with
- | ADD, a::b::ys -> (b + a) :: ys : stack
- | SUB, a::b::ys -> (b - a) :: ys
- | MUL, a::b::ys -> (b * a) :: ys
- | SQR, a::b::ys -> (a * a) :: ys
- | DIV, a::b::ys -> try
- (b / a)
- with
- | :? System.DivideByZeroException -> printfn
- "Dzielenie przez zero"; 0.0
- ::ys
- | PUSH x, ys -> x::ys
- | _ , _ -> raise (BLEDNY_PROGRAM(x, y));
- let wypisz_instr = function
- | ( PUSH x) -> "PUSH " + System.Convert.ToString(x)
- | ( SQR ) -> " SQR "
- | ( ADD ) -> " ADD "
- | ( SUB ) -> " SUB "
- | ( MUL ) -> " MUL ";
- (*let rec wypisz_stos = function
- | [] -> return
- | _ -> a::ys printfn (wypisz_instr a) wypisz_stos ys;*)
- let intpProg(is) =
- let rec iPS = function
- | ([], x::xs) -> x
- | (i::is, xs) -> iPS(is, intInstr(i, xs))
- iPS(is, [])
- [<EntryPoint>]
- let main argv =
- let i1 = PUSH 3.0;
- let i2 = PUSH 4.0;
- let i3 = ADD;
- let stos:stack = [];
- let stos1 = intInstr(i1, stos);
- let stos2 = intInstr(i2, stos1);
- let stos3 = intInstr(i3, stos2);
- printfn "%A" stos3
- //Zadanie 2
- let i4 = PUSH 3.0;
- let i5 = PUSH 4.0;
- let i6 = SUB;
- let i7 = PUSH 2.0;
- let i8 = MUL;
- let stos4:stack = [];
- let stos5 = intInstr(i4, stos4);
- let stos6 = intInstr(i5, stos5);
- let stos7 = intInstr(i6, stos6);
- let stos8 = intInstr(i7, stos7);
- let stos9 = intInstr(i8, stos8);
- printfn "%A" stos9
- //Zadanie 3
- let stos10:stack = [];
- let stos11 = intInstr(PUSH 3.0, stos10);
- (* let stos12 = intInstr(ADD, stos11); *)
- let stos:stack = [];
- let stos = intInstr(PUSH 3.0, stos);
- let stos = try intInstr(ADD, stos) with
- BLEDNY_PROGRAM(a, b) ->
- (
- printfn "Wyjątek: Błędne
- wykonanie programu\nOperand: %A, stos: %A" a b ;
- b
- )
- let il1 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0; MUL]
- let w = intpProg(il1)
- printfn "%A" w
- (*let il2 = [PUSH 3.0; PUSH 4.0; ADD; PUSH 2.0];
- let w1 = intpProg(il2)
- printfn "%A" w1
- let il3 = [PUSH 3.0; PUSH 4.0; ADD; MUL];
- let w2 = intpProg(il3)
- printfn "%A" w2*)
- let il4 = [PUSH 0.0; PUSH 0.0; DIV];
- let w3 = intpProg(il4)
- printfn "%A" w3
- 0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement