Io allows you to write only and exactly what you meant with the least amount of non-essential complexity of any dynamically typed language I know. The lazy evaluation also allows you to take full advantage of code is data / data is code. That sounds like LISP, but whereas there the primitive is the list, in Io the primitive is the message.
My experience trying to write a larger project (a game, never finished) in Io was that it allowed me to make enormous progress initially, but suddenly reached a point in size of the project where the lack of static checking was (IMO) impeding my progress more than the elegance of the language was helping it.
(I also realized at that point I needed to re-implement some things in C++ for performance reasons, not because of Io per se but just because some things needed to be on the "native" side of the fence because things they touched also were.)
When I reached this point in the project, I found there was no clear path to translating what I'd developed into a static language (C++) because many of the ideas and systems I'd created in Io simply couldn't be expressed in C++ - or they made no sense there.
For example I'd created an embedded DSL (something Io excels at) for a data definition of the game objects. When I tried mindlessly converting these Io prototypes into C++ classes, they not only became too verbose they also lost all of the semantics of prototypical inheritance where "take a copy of another thing and tweak it" was my means of building up game objects by incremental refinement.