-
Notifications
You must be signed in to change notification settings - Fork 663
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RangeError
occurs in CP styled functions
#2221
Comments
Thanks for reporting this! To set expectations:
Finally, please be patient with the core team. They are trying their best with limited resources. |
This is the compiled output: var $author$project$T$g = F2(
function (value, cont) {
g:
while (true) {
if (value === 1) {
return cont(1);
} else {
var $temp$value = value - 1,
$temp$cont = function (result) {
return cont(result * value);
};
value = $temp$value;
cont = $temp$cont;
continue g;
}
}
}); It looks like tail-call optimization accidentally broke capturing of arguments, changing the captured values. This problem is evident in perhaps another simpler example: f x l = if x == 0 then l else f (x - 1) ((\_ -> x) :: l)
> List.map (\g -> g ()) (f 10 [])
[0,0,0,0,0,0,0,0,0,0]
: List number The output should be |
For people being bitten by this in the future, using https://github.com/micahhahn/elm-safe-recursion is both going to fix this and allow mutual recursion in TCO |
This fixes elm/compiler#1813 and elm/compiler#2221, which both were issues with overwriting function params in TCO in a way that is observable by closures. We rewrite function params for tail calls to get around this.
Quick Summary: I've been playing with continuation passing styled functions and stumbled upon the code, that seems to confuse the compiler.
Here is the code:
Expected: function
g
computesvalue
's factorialActual (repl):
The text was updated successfully, but these errors were encountered: