this is what the closure actually looks like if you're curious! https://gist.github.com/Archenoth/d189ce7b20ea922be3d3169f6b369fef
(i named it .clj because github doesn't recognize fennel)
basically, every tick, the coroutine to render a single line of dialogue resumes with a new time in scope, and based on that, renders a subset of text
after it renders a full line, it continues to a new yield loop to render the bouncy triangle at the bottom to note you can progress
and when the coroutine finally finishes, a new line takes its place
the magic is that resuming a coroutine just jumps right back to the place i yielded from, so i can break this coroutine into tiny pieces that get rendered every frame
meaning, i only ever need to interact with it in once place after making it; it's completely self-contained!
(i wonder how this compares to how scheme continuations work?)
coroutines function almost as a limmitted version of call/cc, gur limit is that they can only be resumed once for each yield
coroutines can actually be implemented with call/cc, something like
(def (m-coroutine yield-fn)
(show-dialog "* farts *")
(call/cc yield-fn)
(show-dialog "pardon me.")
(call/cc yield-fn))
(def co-resume (call/cc m-coroutine)
; * farts * is shown
(set! (call/cc co-resume))
; pardon me. is shown
@thingywott A lil bit of explaination, gur coroutine takes a function to call when its time to yield, gur yield function takes a funciton to call when its time to resume,
call/cc calls a function passing that function another function(ill call this gur "escape function") that can be called to return to gur point of call/cc 's execution (this function can be called an unlimitted number of times)
gur value passed to gur escape function is gur return value for call/cc
@thingywott gur reason we call gur co-routine with call/cc is so that we can come back to where we are when it yields, `yield-fn` is gur escape function supplied by using call/cc,
gur reason for yielding with call/cc is so gur co-routine returns it's own resume funciton
that might not be gur best explaination but i hope it helps!
(i had to implement call/cc myself to actually understand it)
@bx it does, thank you~ ^^
i've known about the existence of generators, coroutines, and continuations for a pretty long time, but i just never used them, so i didn't really internalize the differences between the three
so, when i finally had a reason to actually try out coroutines in fennel, it really seemed like something i could apply a lot more generally--but it also seemed similar to what i remembered thinking when looking at call/cc, hence my curiosity
@technomancy underrated phenomenon tbh
because i think trying things out is infinitely cooler too
(also thank you..!)
@technomancy oh really??
it didn't instantly highlight in the gist editor when i gave it a fnl filename, but i'll have to try that next time!
@thingywott (btw I think github added support for Fennel recently so the .clj trick shouldn't be necessary any more)