LINUX.ORG.RU

Ответ на: комментарий от anonymous

Чем, например?

Ты, наверно, совсем не знаешь, что такое LINQ? Иначе как можно сомневаться, что это хорошо?

Надо перечень фич показать или сформулировать, почему организация разного рода выборок данных на основе каких-то критериев в императивном стиле очень неудобна?

Reaper ★★
()
Ответ на: комментарий от Reset

>В продолжениях основное - сохранение контекста.

Это ты говоришь про высокоуровеневую штуку «как это выглядит в виде API». А я написал как это выглядит под капотом - там где tailcallы нужны.

У тебя есть код.

Прямой код:

fun double(X) = X * X.

main...

Y = double(6).
Z = double(Y)
print(Z).

или проще:

print(double(double(6))).


CPS код:

fun double(X, k) = k(X*X).

main...

double(6, Y -> double(Y, Z -> print(Z))).


Смысл - можно нажать паузу/сохранить контекст вычислений/запросить асинхронно ввод перед исполнением последующего кода переданноого в виде замыкания.

Данное преобразование может осуществлятся автоматически. Абсолютная необходимость в таких преобразованиях - tail-callы. В контексте tailcall/continuation речь идет скорее о поддержке CPS в JVM чем о высокоуровневом фреймворке для жабы.

r ★★★★★
()
Ответ на: комментарий от r

В каком месте это не CPS?

А в каком месте это CPS? Где ты передаёшь процедуре продолжение? Изобрази на своём «CPS» call/cc.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

>Вот этот пример в CPS, но не твой первый.

Разница между ними в том чт опервый пример все на лямбдах а тут есть конкретная функция.

double(X, k) -> k(X*X)

тоже что

(X,k) -> k(X*X) или после карринга X -> k -> k(X*X), где если вместо k подставить print(Y) aka Y -> print(Y) получиться такой же бред как наверху X -> (Y -> print(Y))(X*X) (в декаррированном редуцированном виде). Наверху меня сильно покусали лямбды - но суть преобразования та же самая.

r ★★★★★
()
Ответ на: комментарий от r

Да реч не о лябмдах:

Если пеерписать это

main {
Y = read()
X = f(Y)
print(X).
}

в CPS, то будет

main = \k -> read(\y -> f(y, \x -> print(x, k)))

Здесь каждый вызов является хвостовым.

Это же

(Y -> (X -> print(X))(f(y))))(read()).
преобразование определения переменных в лямбда выражения. Ни одна из функций своего продолжения параметром не получает.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

>Ни одна из функций своего продолжения параметром не получает.

Этот параметр уже редуцирован вовнутрь. Я ж говорю сильно лямбды покусали - я там наавтомате редуцировал k - то бишь слишком далеко зашел:)

r ★★★★★
()
Ответ на: комментарий от r

А - я тебя понял. Я сделал преобразование где каждый передача k сделана через редуцированную лямбду без CPS преобразования самих функций.

r ★★★★★
()
Ответ на: комментарий от Reset

Ага, ага. Только на жабе без костылей написано на порядки больше хорошего и полезного софта, чем на хипстерских понтоязычишках с лямбдами и хрямбдами.

anonymous
()
Ответ на: комментарий от anonymous

Таков уж феномен IT, что выигрывает не лучшее решение, а агрессивно пропиаренное.

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.