Log In  

Is there a way to evaluate a function call stored as a string, say "cls(2)"? I tried

eval("cls(2)")

but nope; no such beast.

P#86427 2021-01-13 16:34

no - and unlikely to happen as it would "break" the token limit.

P#86436 2021-01-13 18:54
:: alexr

I can imagine. Thanks.

P#86440 2021-01-13 20:01

I've developed a little system that does something kind of like this, in that it can execute a list of function calls via instructions encoded into a string. I was going for an efficient way of drawing an arbitrary number of shapes on screen, but it seems to work with all types of functions. Here's a little demo where it clears the screen and draws a few shapes.

s="````ナ██らきそきそっらめhxxらア"

function _update()
 local t,f={},{pset,line,oval,ovalfill,rect,rectfill,spr,cls}
 for i=0,#s-1 do
  t[i%5+1]=ord(s,i+1)-96
  if(i%5>3) f[t[5]\16](unpack(t))
 end
end
P#86478 2021-01-15 02:51 ( Edited 2021-01-15 03:38)
:: alexr

@JadeLombax I'd never heard of pack/unpack until today.

I was in fact looking for a way to script game actions (or function invokations) in a format similar to that of an animation exposure sheet. It makes things easier (for me) to tweak once foundation logic is in place.

Barring ability to evaluate strings as code, I ended up doing this. I have a feeling that pack/unpack will come in handy in no time at all. :)

Thanks!

function _init()
 t=0
 after(30,set_draw,drw_1)
 after(60,set_draw,drw_2)
 after(90,set_draw,drw_3)
end

function _update()
 t+=1
 upd_cq(t)
end

function _draw()
 cls()
 print(t,8,8,7)
end

function drw_1()
 cls(1)
 print(t,8,8,7)
end

function drw_2()
 cls(2)
 print(t,8,8,7)
end

function drw_3()
 cls(3)
 print(t,8,8,7)
end

-- command queue
cq={}

function after(tix, cmd, arg)
  add(cq, {tix=tix, cmd=cmd, arg=arg})
end

function upd_cq(t)
  for c in all(cq) do
    if c.tix==t then
     c.cmd(c.arg)
     del(cq,c)
    end
  end
end

-- commands
function set_draw(f)
 _draw=f
end
P#86496 2021-01-15 21:47 ( Edited 2021-01-15 21:50)

Glad I could offer something helpful.

I guess I'm not totally understanding your system. Maybe there's some more complex stuff it could do, but if you're interested I came up with a very small version that does the same kind of thing as the current code, just using table values to define the different states instead of separate functions.

t=0
tbl={1,2,3,8,9,5}
function _update()
 t+=1
 if(t<=150) col=tbl[t\30+1]
 cls(col)
 ?t,8,8,7
end
P#86503 2021-01-16 04:06 ( Edited 2021-01-16 04:07)
:: alexr

That was purely for demonstration purposes. The idea (for my needs) is to list the steps of a command sequence in as succinct a manner as possible. And yes, if I only wanted to change the color for cls at regular intervals, my code sample would represent one very convoluted way of doing that. :)

P#86504 2021-01-16 04:23

This is pretty easy if you already have a way of splitting the function name & arguments.

local functionTable = funcT{} --This table contains all of the functions you're planning on using.
local functionTable = math.sin --You can add any default function to it

funcT.f = function(x) --example function
  print("hello " .. x)
end

local functionString = "f" --this string contains whatever function you want to call

local argumentString = "world" --this string contains the argument to that function. Doesn't need to be a string

(funcT[functionString])(argumentString) --This is the syntax for calling a function from a table.

--You can also do this with global functions:

function a()
  print("hello world")
end

(_G["a"])()

I think this is the closest to what you want. Of course, you'd still need a way of splitting the function and its arguments into a separate string.

P#86546 2021-01-18 00:46

[Please log in to post a comment]

Follow Lexaloffle:        
Generated 2021-03-04 06:16 | 0.031s | 2097k | Q:27