4.3BSD/usr/contrib/icon/book/f/infix.icn

procedure main()
   while write(infix(read()))
end

procedure infix(exp)
   return (exp ? form(tab(upto('(')),move(1) & tab(bal(',')),
      move(1) & tab(-1))) | exp
end

procedure form(op,arg1,arg2)
   return "(" || infix(arg1) || op || infix(arg2) || ")" 
end