Page 1 of 1
calling a function from an argument of another function
Posted: Wed May 29, 2013 1:09 pm
by a7s1h1
Is it possible to call a function from an argument of another function, like this: ?
Code: Select all
function love.load()
tmr=4
end
-- function "timer" is called from love.update(dt):
-- The function print('Hi') prints the word "Hi"
function love.update(dt)
timer(tmr,print('Hi'),dt)
end
-- the timer counts back and when it reaches 0, the function print('Hi') should be performed from an argument "func"
function timer(timer,func,dt)
if timer>0 then
timer=timer-1*dt
if timer<=0 then
return func
end
end
tmr=timer
end
Re: calling a function from an argument of another function
Posted: Wed May 29, 2013 1:50 pm
by Starry
I'm gunna say yes but i'm not certain this is what you're asking. code follows
Code: Select all
function love.load()
timerx = 4
function timecount(x,y)
love.graphics.print(x, 10, 10)
love.graphics.print(y, 10, 20)
end
function testing()
return "Hi"
end
func = testing()
end
function love.update(dt)
bonzer = dt
end
function love.draw()
timecount(func, bonzer)
end
you can't call dt from draw without problems so I bonzered it to save time and reading, i got stuff to do today >_>
(I would think there is more to this since your return wouldn't always be a string...)
ed: timerx is supposed to be in there too but i forgot to put it back in after fixing dt..my bad
Re: calling a function from an argument of another function
Posted: Wed May 29, 2013 2:35 pm
by micha
In Lua function are first class values. That means that you can call a function and give a function as an argument. See for example the generic sorting function in Lua.
However, "print('Hi')" is not a function. That is why your code would not work. "print" is a function. For your purpose you need some sort of function-factory, that makes a function, that does "print('Hi')".
Code: Select all
function factory(text)
return function() print(text) end
end
(disclaimer: this is untested, maybe I forgot some brackets or something)
Re: calling a function from an argument of another function
Posted: Wed May 29, 2013 8:09 pm
by a7s1h1
function factory(text)
return function() print(text) end
end
Well, I see, I can set an argument of a function2 as an argument of a function1, which runs the function2. But what if the function does not have any arguments? How can I call it from another function? (The issue is not about printing function, as a matter of fact, it does not even matter, what shoul the function do, the question is how to make it perform)
It won't work, just to describe what I need:
Code: Select all
function1 (function2)
<perform function2>
end
Or the larger example:
Code: Select all
if a=1 then
func_1(func_2)
end
function func_1(func)
<returns func(in that case func=func_2, so the function func_2() should be performed)>
end
function func_2()
<does not matter what>
end
Of course, neither of these codes will work, but they describe what I'm trying to find.
Re: calling a function from an argument of another function
Posted: Thu May 30, 2013 10:58 am
by micha
I just realize, my example was overly complicated.
To your question: You can for example define a function, that displays some text, and that does not take any input, as follows:
Code: Select all
fun = function () print('foo') end
Now you have a function, called "fun". If you type
It will be executed and display "foo".
And for a simple example of a function, that has a function as argument you could have this:
Code: Select all
function runFunctionIfPositive(a,f)
if a>0 then
f()
end
end
This example is just for illustration. The function checks if a is positive and then runs the function you hand over to it. In this case, it is assumed that f has not input arguments.
Re: calling a function from an argument of another function
Posted: Thu May 30, 2013 3:21 pm
by a7s1h1
Now I understood!
For example, if I create these two functions
Code: Select all
function print(text,x,y)
love.graphics.setFont(font)
love.graphics.print(text,x,y)
end
function performfunction(func,ar1,ar2,ar3)
func(ar1,ar2,ar3)
end
Then calling performfunction(print,'It works!',300,200) will perform function print(text,x,y) and so print the text according to the related arguments.
That is easier than I thought - It appears that just I have to set every element of a function (it's name and each argument) as a separate argument of a function, which calls it.
Thanks a lot for the help!
Re: calling a function from an argument of another function
Posted: Thu May 30, 2013 9:18 pm
by Plu
On a sidenote, I'm not sure it's a good idea to overwrite the "print" function as it's a basic part of Lua and LÖVE. Weird things might happen. Plus you won't be able to print to the console window anymore.
Re: calling a function from an argument of another function
Posted: Fri May 31, 2013 7:59 am
by Robin
a7s1h1 wrote:it's name and each argument
Note you're not passing function names, though: you're passing the actual function. You can do:
Code: Select all
performFunction(function(a,b,c) print("Wee", a, b, c) end, 1, 2, 3)
-- prints Wee 1 2 3
-- assuming you didn't bind the name "print" to another function, like you did in your sample
And you don't need to pass each argument to the function calling the other function, if you want it to be the same every time. You can do, for example:
Code: Select all
function performfunction(func,ar1,ar2)
func(ar1,ar2,ar3, 200)
end