datatype instruction = ADD | SUB | MUL | ^^ | WR | RD | PUSH of real; type stack = real list; exception zlainstruc; fun intInstr ( ADD , x::y::xs) = (x+y)::xs | intInstr ( MUL , x::y::xs) = (x*y)::xs | intInstr ( ^^ , x::xs) = (x*x)::xs | intInstr ( PUSH a,xs) = a::xs | intInstr ( SUB , x::y::xs) = (x-y)::xs | intInstr ( _ ,xs) = raise zlainstruc; val i1 = PUSH 3.0; val i2 = PUSH 4.0; val i3 = ADD; val stos = []:stack; val stos1= intInstr(i1,stos); val stos2= intInstr(i2,stos1); val stos3= intInstr(i3,stos2); val i1 = PUSH 3.0; val i2 = PUSH 4.0; val i3 = ADD; val i4 = PUSH 2.0; val stos = []:stack; val stos1= intInstr(i1,stos); val stos2= intInstr(i2,stos1); val stos3= intInstr(i3,stos2); val stos4= intInstr(i4,stos3); val stos5= intInstr(MUL,stos4); val stos = intInstr(PUSH 2.0,stos); val stos = intInstr(PUSH 3.0,stos); val stos = intInstr(PUSH 4.0,stos); val stos = intInstr(ADD,stos); val stos = intInstr(MUL,stos); val stos = []:stack; val stos1 = intInstr (PUSH 3.0 ,stos) ; (*val stos2 = intInstr (ADD,stos);*) val rejestr :real = 0.0; exception BLedny_Program of instruction * stack; fun intInstr ( ADD , x::y::xs, rejX:real) = ((x+y)::xs,rejX) | intInstr ( MUL , x::y::xs, rejX) = ((x*y)::xs,rejX) | intInstr ( ^^ , x::xs,rejX) = ((x*x)::xs,rejX) | intInstr ( WR , x::xs,rejX) = (xs,x) | intInstr ( RD , xs,rejX) = (rejX::xs,rejX) | intInstr ( PUSH a,xs,rejX) = (a::xs,rejX) | intInstr ( SUB , x::y::xs,rejX) = ((x-y)::xs,rejX) | intInstr ( instrukcja,stos ,rejX ) = raise BLedny_Program(instrukcja,stos); exception zle; fun intpProg (il) = let fun IPS([],(x::xs,rejestr)) = (x,rejestr) | IPS(x::is,(xs,rejestr)) = IPS(is,intInstr(x,xs,rejestr)) | IPS([],([],_)) = raise zle in IPS(il,([],rejestr)) end; val il1 = [PUSH 2.0,PUSH 3.0,ADD,WR,PUSH 4.0 ,PUSH 2.0, PUSH 3.0,ADD,MUL,RD,ADD ]; intpProg(il1);