As a fresh Adam in the Nim paradise, I didn't want to start too ambitiously. Just do some thinking about and experimenting with naming the other creatures. Oof, quite a tough job! I've found 12+ laws of nature so far, that apply to both keywords and identifiers:
1. Most characters above U+001F are allowed (e.g. `déjà_vu`), but some require the name to be stropped, e.g. `{`}2nd_thought{`}`, or `{`}echo{`}` as a variable name [`{`}` means a backquote]. Forbidden characters are `#`, `,`, `;`, and U+007F (DEL), unless quoted as character or string. 2. Single and double quotes must constitute valid character and string values, e.g. `{`}A'b'cde{`}` and `{`}A"bc"de{`}`. Or they must be quoted as character or string themselves. 3. Stropping delimiters cannot be stropped themselves otherwise than quoted as character or string. 4. Spaces and matching pairs of single and double quotes are removed, so `{`} A 'b'c de {`}` ⇒ `Abcde`. 5. The first character after removal of the spaces and quoted is case-sensitive. 6. The next characters are case-insensitive, as far as they are within the ASCII range U+0020 – U+007F. In fact, the uppercase letters within this range are converted to lowercase. So `ABÇDÉ` ⇒ `AbÇdÉ` (not `Abçdé`). 7. A single underscore is used for discarding values, as in `let (first, _) = (x: 100, y: 50)`. 8. Underscores are not allowed _(a)_ at the beginning, _(b)_ at the end, _(c)_ directly after another underscore, or _(d)_ after an en-dash. 9. Other underscores are removed, so `A_bc_de` ⇒ `Abcde`. 10. En-dashes are not allowed _(a)_ at the end or _(b)_ directly before an underscore. 11. En-dashes are not removed. Nevertheless, they are all ignored when comparing names, except for an en-dash at the first position. 12. When you use characters in the ranges U+0020 – U+002F, U+003A – U+003F, U+005B – U+005E, and U+007B – U+007E, a plethora of more lenient but also more complex rules fall to you. For instance, `{`}_ A __(B C)_.DE!_{`}` is a valid variable name, which can be referred to as `{`}_ a __(bc)_.de!_{`}` (you still need the spaces around the `a` to make it a valid expression, but the space between `b` and `c` can be omitted). So you can start and end an identifier with an underscore, if you really want to. I may have missed something. Actually I'm looking for some bible that describes the rules in more detail and in a more consistent way than the empirical ones above. But maybe it's too early for that. Anyway, if I have to distill a commandment from all this, it would be "Stick to the alphabet and numbers, or thou willst be driven out of paradise."