sometimes i wish crystal had type based control of i/o. (not necessarily non-strict evaluation and the io monad a la haskell, though...) i'm looking at a boatload of code and wondering, "does this all just compute a result, or do i have to scan for the side-effects..."