You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Based on my understanding, it seems that using a case expression for pattern matching, rather than a function head, prevents the automated analyzer from detecting tail recursion.
From what I've read, using a single function head with at top-level case expression for pattern matching should result in essentially the same thing as using multiple function heads, once they are compiled. If that's correct, then it seems the analyzer should be able to detect tail recursion in the case expression variant shown (commented out) below.
It's also possible that there's a gap in my understanding and having the recursive call "wrapped" in a case expression results in a solution that isn't tail-recursive. 😄
defencode(dna)do_encode(dna,<<>>)end# The analyzer says this function IS NOT tail recursive# defp _encode(dna, acc) do# case dna do# [] -> acc# [c | rest] -> _encode(rest, <<acc::bits, encode_nucleotide(c)::4>>)# end# end# The analyzer says this function IS tail recursivedefp_encode([],acc),do: accdefp_encode([c|rest],acc),do: _encode(rest,<<acc::bits,encode_nucleotide(c)::4>>)
The text was updated successfully, but these errors were encountered:
Honestly, this issue is a bit above my skill level 😛
using a single function head with at top-level case expression for pattern matching should result in essentially the same thing as using multiple function heads, once they are compiled
Still, I don't think we will be able to fix this in the analyzer. The analyzer does a simple check of the AST - is the last call in the function body a call to itself? If yes, that's "tail call recursion" for the purpose of learning on this platform. This is very simplified compared to what the Elixir compiler does when trying to optimize our code, but what else is the analyzer supposed to do?
Based on my understanding, it seems that using a
case
expression for pattern matching, rather than a function head, prevents the automated analyzer from detecting tail recursion.From what I've read, using a single function head with at top-level
case
expression for pattern matching should result in essentially the same thing as using multiple function heads, once they are compiled. If that's correct, then it seems the analyzer should be able to detect tail recursion in thecase
expression variant shown (commented out) below.It's also possible that there's a gap in my understanding and having the recursive call "wrapped" in a
case
expression results in a solution that isn't tail-recursive. 😄The text was updated successfully, but these errors were encountered: