# Executing A Recursive CFThread In ColdFusion 9

By on
Tags:

Earlier this morning, I explored the fact that ColdFusion CFThread tag bodies are executed as function calls. While I didn't see any practical value to knowing this (yet), it did present a few more opportunities for exploration. Any time there is a function, there is an opportunity to play with one of computer science's greatest achievements: recursion. Given that the underlying mechanism of the CFThread tag is a function, I wondered if I could use it to execute CFThread recursively.

Before I show you this code, please note that this exploration is completely for fun! I am in no way advocating that using this approach has any benefits over using a standard ColdFusion function; in fact, this approach is markedly more complicated. That said, as a basic recursive experiment, I tried to have CFThread compute a mathematical factorial:

``````<!--- Launch a thread that will act as factorial calculation. --->
name="factorial"
value="10">

<!---
NOTE: In the following code, we can keep referring to
attributes since it is always being passed as a method
argument.
--->

<!---
Check to see if the value is 10. If so, then we want to
store the result into the thread. Only
--->
<cfif (attributes.value eq 10)>

<!--- Get the next factorial result. --->
<cfinvoke
returnvariable="result"
method="#getFunctionCalledName()#"
attributes="#{ value = (attributes.value - 1) }#"
/>

<!---
Multiple the previous factorial with the current value
and store it into the Thread object.
--->
<cfset thread.result = (attributes.value * result) />

<!--- Check to see if the value is greater than one. --->
<cfelseif (attributes.value gt 1)>

<!--- Get the next factorial. --->
<cfinvoke
returnvariable="result"
method="#getFunctionCalledName()#"
attributes="#{ value = (attributes.value - 1) }#"
/>

<!---
Return the current value multiplied by the next
recursive value.
--->
<cfreturn (attributes.value * result) />

<cfelse>

<!---
If we are at one, simply return the value - there is
no further recursion that we can apply.
--->
<cfreturn 1 />

</cfif>

<!---
Join the thread to make sure that we can get at the
--->

<!--- Output the results. --->
<cfoutput>

</cfoutput>
``````

As you can see, I am using ColdFusion 9's new function, getFunctionCalledName(), to figure out the name of the function object behind the CFThread tag. Then, using that method name, I am able to invoke the CFThread tag body programmatically with CFInvoke. When I call the method recursively, I have to be careful to set up the appropriate environment, passing in an Attributes struct as an argument each time. When we run the above code, we get the following output:

10! = 3628800

As you can see, the CFThread tag was able to execute recursively, working its way down to one (1) and then back up, multiplying each value to find the given factorial.

Again, there is nothing practical about this - it was just a fun experiment (depending on what your definition of "fun" is).

Want to use code from this post? Check out the license.

Great post Ben.

Although there may not be any necessity for such functions (yet, anyway.. you may have stumbled across a life-changing bit of code here ;) ) the fact remains that once again you've taken the time to explore and delve further into the code and it's underlying assets, always asking "what if?" or "why?" compared to the question generally asked which is "how?".

Awesome.