我正在阅读http://learnyousomeerlang.com/errors-and-exceptions上的 Erlang 课程
我不明白这部分:
据说 try 和 of 之间的表达式是受保护的。这意味着该调用中发生的任何类型的异常都将被捕获。
和
异常的受保护部分不能是尾递归的。
[...]
通过将您的递归调用放在 of 和 catch 之间,您不会处于受保护的部分,您将受益于 Last Call Optimisation。
所以我们不能把递归调用放在异常被捕获的部分吗?那么 try catch 块有什么意义呢?
在页面下方,我们在受保护部分有一个带有尾递归函数的示例......
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).
他的意思是当我们处于 try catch 的受保护部分时,我们需要使用一个函数将尾递归代码包装到一个函数中吗?