类似于惰性函数式语言,Oz允许某些形式的尾递归优化,这在某些严格的函数式语言(包括Standard ML、Scheme和并发函数式语言Erlang)中是找不到的。然而,在Oz中,标准函数定义并不是惰性的。
接下来,它展示了以下在Oz中是尾递归的函数。
fun {Map Xs F}
case Xs
of nil then nil
[] X|Xr then {F X}|{Map Xr F}
end
end
这个函数的作用是将空列表映射到空列表,将非空列表映射到将函数 F 应用于其头部并将结果前置到对尾部调用 Map 的结果。在其他语言中,这不是尾递归,因为最后的操作是前置而不是对 Map 的递归调用。
所以我的问题是:如果“Oz 中的标准函数定义不是惰性的”,那么 Oz 在这个函数上做了什么,使得像 Scheme 或 Erlang 这样的语言无法(或不会)执行尾递归优化?在 Oz 中,一个函数何时是尾递归的?