Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I was under the impression that the article stated that a CALL to a recursive function inside of the try- block would prevent it from being done with a tail call*

Yes, that statement is correct and what we're talking about.

Having a try-finally in the body of the tail-call function shouldn't make a difference.

To be clear:

   try {
      ...
      tailcall(...);
   }
   finally { ... }
That could block tail call optimization.


Right, I completely see how that would prevent it from qualifying as a tail call, my misunderstanding was still different though. For some reason I thought that even if the recursive function was defined within the try-catch block (as below) it would prevent it from using a tail call:

  try
    let rec func ... =
      ...
      func( ... )

    let result = func( ... )
  with
  | ex -> ...
I don't know exactly how I ended up thinking that, seems a bit silly in retrospect.


According to the .NET CLR spec, you're not allowed to have a tailcall within a protected ("try") block or it's handler.

On the other hand, tail-calls can be optimized into a while loop, and the F# compiler does this in some cases (check out the IL it produces), so then you could have a recursive tail-call within a try/finally there, it just wouldn't be using the 'tail.call' / 'tail.callvirt' / 'tail.calli' OpCode.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: