lua-users home
lua-l archive

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




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 <drtimhill@gmail.com> wrote:

On Sep 14, 2013, at 1:26 PM, Philipp Kraus <philipp.kraus@tu-clausthal.de> 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(…)
end

function some_print(…)
end

-- 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](…)
end

-- And call it like this…

program_counter = 1
test(…)
program_counter = program_counter + 1
test(…)

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

--Tim








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?