Thanks for those suggestions, Edward. What's cool is that some of the things you've suggested are things I'm already doing! For instance, the part of the engine that schedules evaluation and renderingĀ tasks will use feedback from each task to decide what minimal amount of dependent work needs to be done. That helps avoid needless rendering (which is currently HTML, SVG, and WebGL all intermingled, so I do need to be careful about layout, paint, and composite ā especially since my frame budget is < 8ms so I can maintain 120fps).
The specific thing that I'm finding tricky is, in short, that there is a certain experience I want to be able to offer the programmer, and that requires being able to visualize execution in a really rich way, and that means I'm only able to design programming semantics that are sufficiently visualizable. The matrix of programming semantics is the 1000 piece clock ā the existence of certain semantics can enable, or prevent, other semantics from being viable, and I want to have the minimal possible set of core semantics. Each new concept I introduce needs to be mapped to some visual characteristic, and the more of that I do, the less room I leave for people to define their own visual meanings (this is an art tool first and foremost). For instance, if I lay claim to "all color" or "all shades of red" to represent something about core Hest semantics, I've just taken away power that the end programmer/artist might want to define their own meaning for.
Currently, I've been able to get about 80% of the way to the level of code expressivity I'm aiming for, while only claiming: points, lines, motion along paths, decorations attached to points and lines, all contained within certain regions of space. The capabilities I'm missing are: ordering/sequencing (eg: building arrays, or calling a function with arguments in a certain order) and storage (eg: variables, databases, lookup, query, etc). I'm sure I'll be able to get them, I just need to be able to explore ideas for those things while keeping in mind (A) all the existing semantics, (B) all the semantics I've tried and ruled out, (C) the things all those semantics either enabled or prevented on their own, and (D) all combinations thereof. I could easily decompose this into smaller problems if I wanted to somehow ignore or isolate semantics so there aren't all the combinations and interactions, but I don't.