#! /usr/bin/env perl use v6; my %operators = ( '+' => sub { [+] @_ }, '-' => sub { [-] @_ }, '*' => sub { [*] @_ }, '/' => sub { [/] @_ }, ); grammar rpn_data { rule value { -?\d+ } rule operator { <[+*/\-]> } rule expression { } } sub rpn_eval (Str $e) returns Num { my @stack; # die "Invalid RPN: $e" unless $e ~~ //; for $e.split() -> $tok { if $tok ~~ / / { @stack.push($tok); next } @stack.push(%operators{$tok}(reverse @stack.pop, @stack.pop)); } @stack[0] } say rpn_eval($_) while $_ = =<>