Menu

[r350]: / XRPN.MPL  Maximize  Restore  History

Download this file

44 lines (36 with data), 1.2 kB

/*
  A SIMPLE REVERSE POLISH NOTATION CALCULATOR
*/

##LIBHDR

.STACK=%1024 SP=.STACK .SSS=!.STR127

POP() SP>.STACK ? SP=SP!-.REAL$ : [ WRITES("<EMPTY STACK>*N"); 0 ]

EVAL(S;T) [
  ++S%(S%-1)=0;
  %S @ [
    ISSPACE(%S) @ ++S; T=S-1; (%S?==ISSPACE(%S)) @ ++S;
    (%T=S-T-1) ? [
      //WRITEF("[%S]*N", T);
      (T%1=='*+'?%T==1) ? [ POP() ? .RADD(SP,SP,SP!.REAL$) ] :
      (T%1=='*-'?%T==1) ? [ POP() ? .RSUB(SP,SP,SP!.REAL$) ] :
      (T%1=='**'?%T==1) ? [ POP() ? .RMUL(SP,SP,SP!.REAL$) ] :
      (T%1=='*/'?%T==1) ? [ POP() ? .RDIV(SP,SP,SP!.REAL$) ] :
      ==SDIF(T,"SQR"  ) ? [ .RSQR(SP,SP) ] :
      ==SDIF(T,"SQRT" ) ? [ .RSRT(SP,SP) ] :
      ==SDIF(T,"SIN"  ) ? [ .RSIN(SP,SP) ] :
      ==SDIF(T,"COS"  ) ? [ .RCOS(SP,SP) ] :
      ==SDIF(T,"EXP"  ) ? [ .REXP(SP,SP) ] :
      ==SDIF(T,"ATAN" ) ? [ .RATN(SP,SP) ] :
      (T%1=='*.'?%T==1) ? [
        POP() ? WRITEF("= %S*N",.SOFR(.SSS,SP!.REAL$,1,2))
      ] : [
        .ROFS(SP=SP!.REAL$,T);
        AUX ? [ SP=SP!-.REAL$; WRITES("ERROR!*N") ]
      ]
    ]
  ]
]

.(;S!.STR127) [
  WRITEF("REVERSE POLISH NOTATION (RPN) CALCULATOR*N");
  1 @ [ WRITES("? "); READS(S$); EVAL(S$) ];
  0
]

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.