def evaluate( expr ) = stack = [] for token <- expr.split( '''\s+''' ) case number( token ) Some( n ) -> stack = n : stack println( "push $token: ${stack.reversed()}" ) None -> case {'+': (+), '-': (-), '*': (*), '/': (/), '^': (^)}.>get( token ) Some( op ) -> stack = op( stack.tail().head(), stack.head() ) : stack.tail().tail() println( "perform $token: ${stack.reversed()}" ) None -> error( "unrecognized operator '$token'" ) stack.head() res = evaluate( '3 4 2 * 1 5 - 2 3 ^ ^ / +' ) println( res + (if res is Integer then '' else " or ${float(res)}") )