Здравствуйте, Mr.Cat, Вы писали:
MC>А что меняется от того, что их число неизвестно? Ты же проходишь по ним через map. MC>Перепиши с map на велосипедную функцию — и все встанет на свои места.
Меняется то, что, когда я вызываю i-го потомка, мне надо передать в него функцию континуации, которая состоит из вложенных лямбд с параметрами от i-го до n-го и вызовов от (i+1)-го до n-го, а в самой глубине собрать все аргументы всех лямбд в одну последовательность (seq), и передать ее в функцию обработки вершины.
Я что-то как-то не въезжаю, как подобное выглядит.
MC>Другое дело, что от переписывания в cps обход дерева может и не стать оптимальнее. Я не силен в твоем языке и не знаю, есть ли там такое понятие как stack overflow, но если нет — то контекст выполнения (либо объем съеденного стека, либо размер континуации) и так и так будет расти при спуске вниз по дереву и уменьшаться при подъеме вверх.
Это F#. Да, stack overflow в нем есть. Именно поэтому я и хочу переписать все это дело на CPS — перетянуть все в кучу. Я прекрасно понимаю, что я просто эмулирую стек в куче этими континуациями, и что ее объем в памяти наростает по мере погружения. Но вот переполнения стека не будет.