Unfortunately, I got lost at the tree vs. trace image: not knowing the domain, I don’t understand how the right side corresponds to the left, and it doesn’t seem to be explained below. I thought I know what preorder traversal is, but I don’t get why only some nodes get “visited” in the “trace”, I’m confused and not able to unwind that image. I skimmed the rest of the article and in the case studies I don’t seem to see e.g. Red’s reactive GUI system; are those all Rust & JS frameworks? If yes, I’d add a mention that you did a survey of specifically Rust and JS ones only; I believe there are many more in numerous other languages.
Sorry the image was confusing. I used the convention that containers get push/pop and leaf nodes get visit, but this is a detail that’s not essential to the point.
And this post was not intended to be a survey; the scope of that would be immense, as I wouldn’t be surprised if there were 100 frameworks, in two dozen languages. Just off the top of my head and avoiding the “usual suspects,” I know of Revery (Reason ML), Gio (Go), ekmett’s Codex (Haskell), Lager (C++ but written in a hypermodern style), a bunch of Agda stuff like frp_agda, Lazarus (Free Pascal), Pharo (Smalltalk), Elm (Elm), and I’m sure there are many others. I picked examples that illustrated some point, were explained reasonably clearly, or might be familiar to readers. If Red’s UI has good docs, I will happily reference it in future works.
Late response, but: on the data structure vs execution trace discussion, there’s some nice prior art in graphics for the latter going back about ten years under the name immediate mode GUI. I heard of it in game programming through folks like Casey Muratori, who was adjacent to the Jonathan Blow/Mike Action school of thought about performance, explicitly fitting data structures to machine architectures, and kids these days. I don’t think it made it out of game programming because I didn’t hear anything about it for a decade and then I think React independently reinvented the wheel with some ideas out of functional programming.
Also a fun note that a non-strict language blurs the line between the two paradigms in a powerfully instructive way.
Unfortunately, I got lost at the tree vs. trace image: not knowing the domain, I don’t understand how the right side corresponds to the left, and it doesn’t seem to be explained below. I thought I know what preorder traversal is, but I don’t get why only some nodes get “visited” in the “trace”, I’m confused and not able to unwind that image. I skimmed the rest of the article and in the case studies I don’t seem to see e.g. Red’s reactive GUI system; are those all Rust & JS frameworks? If yes, I’d add a mention that you did a survey of specifically Rust and JS ones only; I believe there are many more in numerous other languages.
Sorry the image was confusing. I used the convention that containers get push/pop and leaf nodes get visit, but this is a detail that’s not essential to the point.
And this post was not intended to be a survey; the scope of that would be immense, as I wouldn’t be surprised if there were 100 frameworks, in two dozen languages. Just off the top of my head and avoiding the “usual suspects,” I know of Revery (Reason ML), Gio (Go), ekmett’s Codex (Haskell), Lager (C++ but written in a hypermodern style), a bunch of Agda stuff like frp_agda, Lazarus (Free Pascal), Pharo (Smalltalk), Elm (Elm), and I’m sure there are many others. I picked examples that illustrated some point, were explained reasonably clearly, or might be familiar to readers. If Red’s UI has good docs, I will happily reference it in future works.
Thanks for the clarifications!
Unfortunately, Red UI’s docs are medium quality in my opinion.
Late response, but: on the data structure vs execution trace discussion, there’s some nice prior art in graphics for the latter going back about ten years under the name immediate mode GUI. I heard of it in game programming through folks like Casey Muratori, who was adjacent to the Jonathan Blow/Mike Action school of thought about performance, explicitly fitting data structures to machine architectures, and kids these days. I don’t think it made it out of game programming because I didn’t hear anything about it for a decade and then I think React independently reinvented the wheel with some ideas out of functional programming.
Also a fun note that a non-strict language blurs the line between the two paradigms in a powerfully instructive way.