Path: utzoo!attcan!uunet!charyb!dave From: dave@charyb.COM (Dave Rifkind) Newsgroups: comp.lang.c Subject: A method for suspending functions in C Keywords: twisted suspend Message-ID: <421@charyb.COM> Date: 5 Mar 90 18:16:24 GMT Reply-To: dave@charyb.UUCP (Dave Rifkind) Organization: KFW Corporation, Newbury Park, CA Lines: 62 A few languages allow subroutines to be temporarily suspended and their execution resumed later. Icon, for one, uses this mechanism for implementing generators (functions that return a sequence of values): procedure onetoten() every i := 1 to 10 do suspend i end or equivalently: procedure onetoten() every suspend 1 to 10 end Clearly this does *not* translate into C as: int onetoten() { int i; for (i = 1; i <= 10; i++) return i; return 0; } Here's a possible way to write the same function in C: int onetoten() { static int state = 0; static int i; switch (state) { case 0: for (i = 1; i <= 10; i++) { state = 1; return i; case 1: } state = 0; return 0; } } This can be extended to much more complex functions. There are other ways to reach the same result, probably much less twisted in most cases, but this method has one advantage: a function can be turned into a generator without rearranging its logic, simply by embedding it in a switch statement. There are some obvious restrictions. The function cannot be recursive or reentrant, and only one instance can be alive at a time. Variables that need to live across suspensions must be static. There cannot be suspensions within other switches inside the function (but those can usually be rewritten using "if" and "else"). Perhaps the largest disadvantage of this method is that your colleagues may be tempted to do you physical harm if they find you writing this kind of code.