<Reposting ;)> Periodic self-reminder. The main ...
# thinking-together
i
Reposting ;) Periodic self-reminder. The main ideas behind Hest are: 1. Nobody’s made a good computer code out of things moving through space. 2. Moving through space is also about moving through time. Rewind is table stakes. 3. If moving through space is meaningful, then space itself is part of that meaning. Position, distance, velocity — they mean something. 4. You can do things with this meaningful space-time visual code that you simply can't do in a non-moving visual code.
c
Have you thought about how proximity as meaningful computation comes into play here?
i
Yep. One of my favourite references for proximity is the

Zells

project by @Nikolas, which visualized message broadcasts as these rings that expand outward from an object. Receivers that are near the source will receive the message first. Also, there's eToys (IIRC… or maybe it was Morphic?) where you'd compose two graphical objects by sticking one onto the other — that's a more binary interpretation of "proximity", in that things that touch are composed, things that don't touch aren't. There are also some grid-based systems where cells can only talk to their neighbours. One approach I've tried in Hest visualizes functions as nodes, function composition as wires connecting the nodes, and function application as little points of data travelling along the wires. The speed that data travels is constant, so execution order depends on things like the lengths of wires between nodes.
c
Oh wow Zells is really cool!
r.e. hest, have you found there to be any tension between wire length as meaningful computation and if someone might want to layout nodes and wires in alternative ways to facilitate better understanding?
i
Yes. And I've had a few ideas for how to resolve this tension, such as: • Other kinds of wire with different conveyance semantics (eg: wires that convey instantly, or that do a store-and-forward sort of thing) • Varying the speed of wires (which is what Factorio does) • Backing away from the idea that there are multiple pieces of data moving simultaneously, and instead only having a single moving datum (with others either queued up waiting for their turn, or perhaps requiring execution to be triggered by something separate from the data points) I haven't prototyped any of these yet, though. Also, this is an area where I'm not even sure why order my priorities are in, so while it's easy to imagine a wide variety of solutions, it's hard to have a sense of how these solutions will fit in to the overall design.
c
Do you have good examples of #4
i
Sure. One of my favourites is that, in Hest (node-wire, with data represented as points that travel along wires), you can just grab a data point with your mouse and pull it off of the wire, and stick it off to the side. Then later, you can drop that data point anywhere else in the program and it'll resume travelling toward the next function. It's sort of like REPLing into a running system and pausing a thread of execution and snapshotting the state, and extracting that state and putting it _somewhere_… and then being able to resume execution at any other point with that very same state. But you do it with the mouse, by dragging data around like its a ball bearing in a Rube Goldberg machine.
Here's a pretty bad GIF of me doing that, but using the keyboard instead of the mouse. (It's "pretty bad" because there are an unrealistically large number of data points, and the data points don't show their values, and you don't see any functions. But this was just a silly setup I cooked up to try and make a good GIF for Twitter, hah.)
You have to imagine that each of those points is a value, like
5
or
{x: 20, y: 50, pressure: 15}
or
"Hello, Denver"
, and that on either end of those black wires there's a function like
add
or
split
or
unpack
or whatever.
So when a data point isn't on a wire… it still exists. It can even continue to interact with other on-canvas objects that have programmatic meaning. It's just outside the flow of execution. This is, TTBOMK, really different from what you can do with any other form of representing a program source (both visual and textual) or program execution env (REPL, batch, debugger, etc)
c
Is the ability to pick data points off a wire lead to non-deterministic behavior of the system?
Reminds me of this diagram
i
Is the ability to pick data points off a wire lead to non-deterministic behavior of the system?
Yes. It's much the same as pausing with a breakpoint, changing the values in some variables, and then resuming. You're just also changing a little bit of process stuff at the same time. (Which, I imagine, would be a totally normal thing to do if you were debugging, say, Erlang + OTP. But I haven't done that, so I can only imagine).