20 lines
652 B
Plaintext
20 lines
652 B
Plaintext
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)}") )
|