Size: a a a

Clojure — русскоговорящее сообщество

2020 September 11

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
ну принципиально эта дичь стек не потребляет
там как уже по "абсолютным" значениям - надо смотреть
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Я на самом деле не видел ещё хороших кейсов для такой фичи, поэтому это все эстетические соображения
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Просто хотелось бы, чтобы кложа была максимально близко к Scheme
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
Тут скорей всего вопрос в том, что нет прямого механизма, который бы позволил самостоятельно развернуть рекурсивный алгоритм в tail recursion, поэтому решение на пользователе языка, так сказать
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
Vladimir Pavlyuk
Тут скорей всего вопрос в том, что нет прямого механизма, который бы позволил самостоятельно развернуть рекурсивный алгоритм в tail recursion, поэтому решение на пользователе языка, так сказать
Тем более, не всякая рекурсия развернется
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Это как раз компилятор кложи мог бы делать
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Просто с mutual recursion это сложнее сделать
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
Mikhail Borisov
Это как раз компилятор кложи мог бы делать
типа следить за тем, когда был сделан рекурсивный вызов, и опционально разворачивать?
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
Mikhail Borisov
Просто с mutual recursion это сложнее сделать
trampoline это уж точно костыль. Как минимум потому, что нужно заставлять функцию возвращать вызов самой себя, для отложенности
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Я честно говоря механику не слишком хорошо понимаю. Но суть в том, что если вызов в хвостовой позиции, то нам не нужно стэк накапливать. И это справделиво не только в рамках одной функции, можно и между функциями так делать
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
то есть кодеру нужно еще и обвязку придумать
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Я честно говоря механику не слишком хорошо понимаю. Но суть в том, что если вызов в хвостовой позиции, то нам не нужно стэк накапливать. И это справделиво не только в рамках одной функции, можно и между функциями так делать
Не знаю, в рантайме этот анализ делается или в компайл тайме
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
Mikhail Borisov
Я честно говоря механику не слишком хорошо понимаю. Но суть в том, что если вызов в хвостовой позиции, то нам не нужно стэк накапливать. И это справделиво не только в рамках одной функции, можно и между функциями так делать
да, стек в этом случае не нужен, такая штука однозначно в цикл while какой нибудь переписывается
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
Mikhail Borisov
Не знаю, в рантайме этот анализ делается или в компайл тайме
в кложе loop/recur-у достаточно посмотреть на синтаксис, поэтому в компайл тайме
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
В общем, в итоге это просто позволяет написать стейт машину в виде функций. Нужно ли это, хз :)
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
это макрос, он просто смотрит в код и говорит "ай ай, ты recur дергаешь не последним"
З.Ы. ему видимо за этим и нужно + 2 слова (loop и recur), чтобы рекурсивные вызовы явно обозначить
источник

VP

Vladimir Pavlyuk in Clojure — русскоговорящее сообщество
а с mutual recursion компайл тайма видимо недостаточно
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Да вроде достаточно, просто не по одной функции нужно компилировать
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Кому-нибудь приходилось trampoline использовать?
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
регулярно использую
источник