Hey, i currently try to learn the nix language and i have a question about recursion. This is my solution for Advent of Code 2015 day 4

let
    input = "abcdef";
    part1 = number:
        if (builtins.substring 0 5 (builtins.hashString "md5" "${input}${builtins.toString number}")) == "00000" then
            number
        else
            part1 (number + 1);
    part2 = "not implemented";

in {"Part 1" = part1 1; "Part 2" = part2;}

since i put the recursive call at the end of the function i assumed it would do some magic or tail call optimization stuff, but it results pretty fast in a stack overflow is there a way to get it working?

  • Atemu
    link
    fedilink
    English
    arrow-up
    5
    ·
    9 months ago

    Nix’ stack size is quite limited for a functional language. You cannot have infinite lists either. IIRC it does not do any tail call optimisation; it’s a simple recursive evaluation.

    Note that Nix is not a general purpose programming language that is designed to solve general purpose problems such as this one.