fun readStr () = let fun scan reader stream = SOME (StringCvt.splitl (not o Char.isSpace) reader (StringCvt.skipWS reader stream)) in valOf (TextIO.scanStream scan TextIO.stdIn) end exception BadInput fun findAns s = let fun chars2Int [] acc = (acc, []) | chars2Int (h::tl) acc = if h = #"*" orelse h = #"+" then (acc, h::tl) else chars2Int tl (acc * 10 + (Char.ord h - Char.ord #"0")) fun findAnsAux [] acc = acc | findAnsAux (operatorCh :: l) acc = let val (operand, rest) = chars2Int (List.tl l) (Char.ord (List.hd l) - Char.ord #"0") in if operatorCh = #"*" then findAnsAux rest (acc + operand) else findAnsAux rest (acc * operand) end val ch_s = String.explode s val (firstVal, restChs) = chars2Int (List.tl ch_s) (Char.ord (List.hd ch_s) - Char.ord #"0") in findAnsAux restChs firstVal end val () = let val s = readStr () val ans = findAns s in print (Int.toString ans ^ "\n") end