我讀了二郎山教訓在http://learnyousomeerlang.com/errors-and-exceptionstry catch塊中沒有尾遞歸代碼?
我不明白這個部分:
表達的嘗試之間的被說成是受保護的。這意味着在該調用中發生的任何異常都會被捕獲。
而且
異常的受保護的部分不能是尾遞歸。
[...]
通過把的,趕上你之間的遞歸調用,你是不是在一個受保護的部分,你會從上次通話優化中受益。
因此,我們不能把遞歸調用放在捕捉異常的地方?那麼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的受保護部分時?