Nim is a compiled, garbage-collected systems programming language with a design that focuses on efficiency, expressiveness, and elegance (in that order of priority).
effect violations (raises, gcsafe, side-effects etc) should give warnRaiseMismatch, warnGcsafeMismatch, warnSideEffectMismatch instead of error, rationale:
you can't overload by effect anyways (which is a good thing)
you can still get errors exactly as before, by using warningAsError, but it gives you more control when needed
it removes a lot of friction caused by the viral-ness of effects; oftentimes the violation is only theoretical (eg if a RT condition which would trigger can be assumed by user not to happen) and user can decide whether they're ok with this violation, on a granular basis
this would significantly reduce impact of breaking changes for correctness bugfixes, eg if we discover that in some situation, a raise OsError can happen (eg getcwd can raise in rare conditions and a call now needs getcwd which adds a raise[OsError]), it wouldn't cause a CT error but instead a warnining (which can be turned into a CT error depending on warnaserror); it basically makes code evolution easier, and smooths the upgrade process of a new version of compiler/library.
effect violations (raises, gcsafe, side-effects etc) should give warnRaiseMismatch, warnGcsafeMismatch, warnSideEffectMismatch instead of error, rationale:
this would significantly reduce impact of breaking changes for correctness bugfixes, eg if we discover that in some situation, a raise OsError can happen (eg getcwd can raise in rare conditions and a call now needs getcwd which adds a raise[OsError]), it wouldn't cause a CT error but instead a warnining (which can be turned into a CT error depending on warnaserror); it basically makes code evolution easier, and smooths the upgrade process of a new version of compiler/library.
Viral errors = bad; viral warnings = bearable
links