My RPN calculator code review?

AB ab396356 at users.sourceforge.net
Fri Jul 17 21:37:46 UTC 2020


Hello, inspired by the "Tiny RPN calculator" example seen on the 
dlang homepage, I wanted to create my own version.

I'd appreciate your opinions regarding style, mistakes/code 
smell/bad practice. Thank you.

     import std.array;
     import std.conv;
     import std.stdio;

     void main(string[] args)
     {
         if (args.length == 1)
         {
             writeln("usage examples:\n\t", args[0], " 5 3 + 2 
*\n\t", args[0],
                     " 12.1 11 /");
             return;
         }

         immutable string valid_ops = "+-*/";
         string spaced_args = args[1 .. $].join(" ");

         // this is done to correctly handle "messy" inputs such 
as "5 3 2*+"
         foreach (o; valid_ops)
         {
             spaced_args = spaced_args.replace(o, " " ~ o ~ " ");
         }

         real[] stack;

         foreach (op; spaced_args.split)
         {
     LabeledSwitch:
             switch (op) // operator or operand?
             {
                 static foreach (o; valid_ops)
                 {
                 case [o]:
                     stack = stack[0 .. $ - 2] ~
                             mixin("stack[$ - 2]" ~ o ~ "stack[$ - 
1]");
                     break LabeledSwitch;
                 }
             default:
                 // assume it's an operand, a real number
                 stack ~= to!real(op);
                 break;
             }
         }

         writeln(stack);
     }



More information about the Digitalmars-d-learn mailing list