ich die Erlang LektionKein tailrekursiver Code in einem try catch-Block?
bei http://learnyousomeerlang.com/errors-and-exceptions Ich verstehe nicht, diesen Teil liest:
Die Expression zwischen Versuch und soll geschützt werden. Dies bedeutet, dass jede Art von Ausnahme innerhalb dieses Anrufs abgefangen wird.
Und
der geschützten Teil einer Ausnahme kann nicht Schwanz rekursiv sein.
[...]
Durch Ihre rekursive Aufrufe zwischen der von und zu fangen setzen, sind Sie nicht in einem geschützten Teil, und Sie werden von Last Call-Optimierung profitieren.
Also können wir keine rekursiven Aufrufe in dem Teil, wo die Ausnahmen abgefangen werden? Was ist der Sinn des Versuchs catch Block dann?
Und unten auf der Seite wir mit einem Schwanz rekursive Funktion in dem geschützten Abschnitt ein Beispiel haben ...
has_value(Val, Tree) ->
try has_value1(Val, Tree) of
false -> false
catch
true -> true
end.
has_value1(_, {node, 'nil'}) ->
false;
has_value1(Val, {node, {_, Val, _, _}}) ->
throw(true);
has_value1(Val, {node, {_, _, Left, Right}}) ->
has_value1(Val, Left),
has_value1(Val, Right).
Meint er, dass wir eine Funktion wrap Schwanz rekursive Code in eine Funktion verwenden, müssen wenn wir im geschützten Teil eines Versuches sind?