lua-users home
lua-l archive

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

If you just want to perform the function in sections, how about coroutines?

Something like:

function test({...})
    do first call
    do some print
    do second call
    do some print again
    if (a)
       do A
       do B

co = coroutine.create(test)

counter = 0
while coroutine.status(co) ~= 'dead' do
    counter = counter + 1

On Tue, Sep 17, 2013 at 8:00 PM, Andrew Starks <> wrote:

On Saturday, September 14, 2013, Jon Akhtar wrote:
Have you considered running the byte code from the listing file?

There are lots of steps, I looks like you mean statement by statement, but I am not sure what granularity of execution you need.

You can write the program using strings in a list then loadstring as you go. even. Otherwise you will have to be careful about upvalues and side-effects.

On Sat, Sep 14, 2013 at 8:29 PM, Tim Hill <> wrote:

On Sep 14, 2013, at 1:26 PM, Philipp Kraus <> wrote:

> Hello,
> I would like to use a list structure for calling Lua function. So some explanation.
> I have got a function e.g.
> function test({…})
>     do first call
>     do some print
>     do second call
>     do some print again
>     if (a)
>        do A
>     else
>        do B
>     end
>     ….
> end
> I have got also a "program counter" which is started by 1. On 1 its should run "do first call" on 2 "do some print" and so on.
> I would like to use a Lua function, but I would like to run this function step-by-step. I can use a if construct to check the current
> "program counter value" and run the correct command, but this is not very nice.
> Did you have an idea for this problem?
> Thanks
> Phil

I think what you are really talking about is a state machine, which is often handled by a switch statement. Since Lua lacks these, you end up resorting to a bunch of "if" statements doing one-by-one checks of your program counter, as you note.

The classic alternative to a switch statement for a state machine is a jump table, which is Lua terms is an array of functions. If you re-write each of your steps as a small function:

function first_call(…)

function some_print(…)

-- etc.

-- You can then create an array of these:

call_table = { first_call, some_print, … }

-- Now, you can re-write "test" to just call the appropriate function in the array:

function test(…)
        return call_table[program_counter](…)

-- And call it like this…

program_counter = 1
program_counter = program_counter + 1

-- Of course you can increment the program counter inside each call to test() if that suits your purpose, or even make it an upvalue.


Given the already implemented solution: roughly 25 lines of code, two hidden table accesses, one hidden function call and 0 manual book keeping to do, these suggestions seem like they go further away from the stated goal for seeking alternatives.

So I'm back to asking: what am I missing?