After spending another few hours re-typing this system, it does seem to be a bit more reasonable this way. As I kept iterating on the system, the number of object types has continued to shrink, and it doesn’t even need to be that open ended anymore. It’s been an interesting exercise, and I feel like there’s some good lessons here. I’m really looking forward to having a concatenative language to play with and see how these frictions between dynamic and static typing change in that environment.
For now, I’m feeling like this is coming together. It seems like what we’ve ended up with is a language where we can name and define a few primitive data types, and then a run linear execution of commands with support for list iteration.
---
After a little more implementation, I think I discovered that the outer structure can just be an ‘iterator’, where the object being iterated is just the single root object.