it has to be readable, and small according to your judgement. a good language
allows much factoring, which is an advantage that Nim has. some people may
abuse certain features (and lead to the situation you described), but it
doesn't mean you need to avoid it where it does make sense. in your example, i
would definitely use the oop runtime methods instead of a huge switch case. The
main thing is to reduce complexity, especially in your own understanding of the
code. every part should have one functionality, and clear limits that you
decide. so some general decisions are needed (as well as details of how to
enforce them). In my opinion, if a compiler helps you manage a really complex
project, with a certain compile time checking feature, it may make sense to use
that feature, even if your code diverges from the most direct way of doing
things, because it finds errors at compile time instead of runtime.