Добрый вечер, Антон! «Вообще, на мой взгляд, $iter оправдан по двум причинам: 1) Ситуации, когда рекурсия по сути хвостовая, но не является таковой из-за смежных конкатенаций: (e1 <F e2>)» Тут решает векторно-списковое представление Скоробогатова. Позже о нём напишу отдельным письмом. «2) Отсутствие вложенных функций/замыканий. Выносить каждый простой внутренний цикл во внешнюю функцию (передавая туда все нужные локальные переменные) — слишком тяжеловесно.» Как пользователь Рефала с замыканиями, могу подтвердить. Наиболее частые циклические задачи — обход последовательности с преобразованием и/или с агрегацией. Для этой цели очень удобно использовать функции Map, MapAccum и Reduce, передавая в них замыкание. Но в плане быстродействия это дорого, дороже вручную написанной хвостовой рекурсии. А $iter’а у меня нет. С уважением, Александр Коновалов From: Anton Orlov orlovan_AT_gmail.com <refal@botik.ru> Sent: Saturday, March 2, 2019 10:39 AM To: refal@botik.ru Subject: Re: Сравнение веток Рефала On Fri, Mar 1, 2019 at 4:08 AM Sergei M. Abramov abram_AT_botik.ru <refal@botik.ru <mailto:refal@botik.ru> > wrote: День добрый, Антон, Юра!
Я там как-то невнимательно следил. 1. Р+ с $iter должен быт лучше (не хуже) чем рекурсия. Но не сильно (хвостовая рекурсия мало уступает $iter). $iter не хуже, чем хвостовая рекурсия. Но, конечно, может быть хуже, если пытаться выразить не хвостовую рекурсию и эмулировать стек на рефал-выражениях, например. Вообще, на мой взгляд, $iter оправдан по двум причинам: 1) Ситуации, когда рекурсия по сути хвостовая, но не является таковой из-за смежных конкатенаций: (e1 <F e2>) 2) Отсутствие вложенных функций/замыканий. Выносить каждый простой внутренний цикл во внешнюю функцию (передавая туда все нужные локальные переменные) -- слишком тяжеловесно. 2. Р+ с рекурсией не должен жрать стек (точнее, жрать и освобождать сразу, так как хвостовая). Так и есть? А если не так, то поясните, плз. Так и есть. Антон Всего доброго, Сергей Абрамов