IMO, it has the best ergonomics among scripting languages for embedding into native applications. I'm using it as a serialization format for a game, with the JimTcl interpreter. It's easy to create fluent hierarchical structures that straddle the line between code and data:
Indeed, one point that's often missed about Tcl is that the ability to treat code as data makes it easy to use metaprogramming techniques that are awkward or impossible in most other languages.
Similarly, I have a early-stage JS library for hierarchical statecharts. It revolves around nested contexts and an explicit message passing interface for controlling states between parent/child/sibling. Example:
off-topic but why do you use 'let' instead of 'const'? In royal.ts you do that all the time even though you variables don't change! Is there a reason for that?
I have no idea why they did it, but I have argued for quite some time that const has very little practical value, because its effect is always lexical and local.
To demonstrate that this is so, I suggest that we can write a processor that converts all lets to consts where possible. I also demonstrate that this is so by asking, "What bug will const catch that our tests will not catch?"
_Immutable Data_, on the other hand, is marvellous. Immutability has nonlocal effects, and it is not something that can be trivially verified.
I agree with your assessment, but for me it is a message from the programmer to the reader. Hey this value will not be re-assigned during the following scope block. If I see a let, I know I must be careful.
Of course this doesn't apply to properties of objects ... which is a pity!