New: Nitro Boost our Discord server and receive full donation perks here on the website! Join the Scripting Helpers Discord Server to learn more! You can also Support on Patreon as always.
Still have questions? Join our Discord server and get real time help.
1

# How do I collapse a recursive/embedded function?

This is a very confusing question, but let's imagine this scenario.

There is two tables. However, inside the table contains itself a table of the other.

local digitsofpi = {3,1,4,1,5}
local table = {"These "," are "," digits "," of Pi",digitofpi," very", "interesting"}



What if I wanted to do a function, named "printAllContent()" with one parameter which is a table, where I run through the table's content and print what is inside and a user input is necessary every time you progress through the table, such as clicking the screen.

function printAllContent(table)
for i,v in pairs(table) do
print(v)
repeat
wait()
until UserInput -- This line isn't proper code, it just yields until the user responds
end
end


However, when you come across a table, you will then call the same function, "printAllContent()", however this time you put the table inside the table as the parameter of the function. Now the function looks like this.

function printAllContent(table)
for i,v in pairs(table) do
if isTable(v) then -- This is a made up function which returns if the parameter is a table
printAllContent(v)
end
print(v)
repeat
wait()
until UserInput -- This line isn't proper code, it just yields until the user responds
end
end


This way, it will run through all of the content of the table including the embedded table.

The problem here is that let's say that the user has the option to quit in the middle of the function using another function, "quitPrinting()". This function is connected to an event where a user presses a U.I button on the screen

For example, let's say the printAllContent() function is called and you prematurely end the process by calling "quitPrinting()" when you get to '4'

These
are
digits
of
Pi
3
1
4


And you called the function,printAllContent(), again and you get this

These
very
are
interesting
digits
of
Pi
3
1
4
1
5
very
interesting


While the embedded function was closed, every function call that came before it continued to print. How do I, essentially, stop all function when one recursive function ends.

I hope this made sense, this is a very difficult problem to describe.

For additional context. I am making my own npc dialog system and I'm using tables as the script for the npc tor read, and I also have a button where the player can leave the conversation at any time.

tl;dr In a recursive function, how do I stop all previous functions.

1
sleazel 679
3 months ago
Edited 3 months ago

Seems like a bool variable should do the trick. I hope i did not complicate things too much.

local collapse = false --this variable is outside function, so it will preserve its value
local nestingLevel = 0 --we need to remember how many times the function nested itself, so we can reset collapse variable

function printAllContent(table)
nestingLevel = nestingLevel + 1
for i,v in pairs(table) do
if isTable(v) then
printAllContent(v)
end
if collapse then
nestingLevel = nestingLevel - 1
if nestingLevel = 0 then collapse = false   end
return --it will end current function
end
print(v)
repeat
wait()
until UserInput
--"quit" is my guess only, feel free to adjust
if UserInput == "quit" then
collapse = true
nestingLevel = nestingLevel - 1
if nestingLevel == 0 then   collapse = false end
return --it will end current function
end
end
nestingLevel = nestingLevel - 1
end



Edit: If nestingLevel seems too confusing, you can also manually reset collapse variable after the dialogue ends.

local collapse = false

function printAllContent(table)
for i,v in pairs(table) do
if isTable(v) then
printAllContent(v)
end
if collapse then
return --it will end current function
end
print(v)
repeat
wait()
until UserInput
--"quit" is my guess only, feel free to adjust
If UserInput == "quit" then
collapse = true
return --it will end current function
end
end
end


--somewhere in your code collapse = false

0
Ah, that's a shame, I thought there would be a more elegant answer. Thank you nonetheless! guestnot99 112 — 3mo