lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

On Thursday 04 August 2005 10:46, Dave Dodge wrote:
> >From a glance at the examples, the main problem that sticks out is
> that all of the variables have to be static.  Note that even local
> loop counters within the functions are static.  I think this is
> because the library has no way of actually saving/restoring stack
> data.

I've seen this. Neat, but probably not particularly useful from C.

It would, however, be quite handy for encapsulating state machines inside 
functors in C++ --- you wouldn't have to use all those nasty static variables 
because you'd use class variables instead.

> A generic approach would be a C-to-C translator.  Basically you add
> something like a "resumable" function-specifier to the C grammar,
> and perhaps a "yield" keyword, so that you can do things like this:

You may be interested in OpenC++:

It's a programmable C++ transformer. It will read in a C++ source file into a 
syntax tree, let you do all kinds of wacky stuff to it, and write it out 
again. One of the examples is implementing a forall(){} construction on a 
collection class, which takes as a parameter a code block. Very neat. It 
could do the kind of code rewriting you're talking about in its sleep (if you 
programmed it to).

> I'm not sure this is pure ANSI C.  The stack/context switching is the
> tricky part since C doesn't really have a portable way of doing that.

Last time we talked about coroutines, I suggested ucontext, but it was pointed 
out to me that they're not terribly widespread --- Cygwin doesn't have them, 
for example. setjmp() based systems are more portable and Edgar Toernig 
posted a link to this sample code that implements a bunch of platforms:

+- David Given --McQ-+ 
|    | "The only thing to prevent what's past is to put a
| ( | stop to it before it happens." --- Sir Boyle Roche
+- --+ 

Attachment: pgpVRXSxoy9EF.pgp
Description: PGP signature