|
|
|
|
|
by haberman
3707 days ago
|
|
The Lua implementation is a C library. You invoke it by calling C functions like lua_call(). Imagine you have a C program like this: #include <fancylib.h>
int main() {
for (int i = 0; i < 10; i++) {
printf("val[%d] = %d\n", i, fancylib_calculate(i));
}
fancylib_cleanup();
}
Now imagine that internally, fancylib uses Lua. So fancylib_calculate() calls lua_call().Now imagine that the Lua function run by fancylib decides to use continuations. When you call fancylib_calculate(0), it creates a continuation. And when you call fancylib_calculate(1), it decides to call the continuation. If you restore the entire C stack to resume the Lua continuation, it will reset the loop in main() to i=0! Your program might end up printing val[0] over and over, in an infinite loop. This would be extremely surprising to you as the author of main(), because you were just trying to write a normal old for() loop. The Lua continuation should just restore the Lua-related stack, not the stack of the functions calling Lua! |
|
That's the point of continuations, though. That's a feature, not a bug. When you create a continuation, you're saying "whatever happens after this, allow me to do it again at some later time." If the calling library happened to be in a loop, then the goal is to serialize that loop so that it can be invoked again, at a later point.
If you keep applying the continuation in a loop, then you'll get an infinite loop. But if you invoke the continuation once, (and if subsequent calls to fancylib_calculate() don't), then you'll get the ability to print
on demand. By invoking the continuation, you cause the loop to happen again.In fact, you gain the ability to prevent the program from terminating, in a controlled fashion. Since you have access to the continuation, you can choose to invoke it on the 10th call to fancylib_calculate(), up to 3 times in a row. That would produce output like:
then the program would exit.Does that make sense? Apologies if we're talking past each other. I appreciate the patience.