The simple REPL example is *not* a robust process, because it doesn't make decisions about what happens when `read`, `eval`, or `print` fail. Should we try to address these failure modes, we'd want the error handling to exist at the edge of the process. We don't want, for instance, for `eval` to have to think about what happens when `read` fails due to a malformed input or an I/O failure. That's totally orthogonal to the evaluation itself.
This is oversimplifying a bit, but the core of the process should focus on the happy-path, and the code around it should allow it to pretend that only the happy-path exists. If the core of the process is invoking the edge, it has to start thinking about exception handling, etc which breaks the separation of concerns.
Hope that helps,
Zach