
[Michael Chermside]
Imagine the following senario. I write some code which uses Decimal, and which sets the context to get the desired rounding behavior. Somewhere in my code I call a routine written by somebody else... perhaps some library code... which also does some calculations using Decimal.
It would be a major pain if every time I called that library code it changed the context. I'd have to keep setting the context back after each and every call to the library code. A well-behaved library will not require me to go through these contortions, so after it does its work it will set the context back to what it was when I called it.
A well-designed library will restore only *part* of the context. Some of the state in numeric context controls arithmetic behavior, but other parts are informational, telling you about exceptional conditions that occurred. The user can choose to let exceptions be raised, or to suppress them (via settings in numeric context). In the latter case, knowledge that an exceptional condition occurred is *recorded* in context. A well-designed library can't assume that the user wants exceptions to be raised, but must inform a user running in "non-stop" mode that exceptional conditions occurred. Context is the way to do that; context holds both input and output state. It's difficult to write high-quality numeric libraries. The facilities offered by numeric context are a great aid in doing so, but it's still too complex for simple gimmicks like "a stack" to help. The burden is on code that changes context to do so correctly from its caller's POV; if you call a routine that makes a mess of your context, that's an error in the routine you called. In the same vein, if you write a routine that requires a specific rounding mode, and don't arrange to force that rounding mode for the duration of your routine, your routine is in error. It's also in error if it doesn't restore the rounding mode in effect when it was entered. It's also probably in error if it *does* blindly restore the settings of the informational flags.