Re: Continuation Passing Style
"An Operational Semantics for I/O in a Lazy Functional Language"
ftp://ftp.cl.cam.ac.uk/papers/adg/fpca93.ps.gz
ftp://ftp.cl.cam.ac.uk/papers/adg/fpca93.ps.gz
Ну давай теперь рассказывай!
А то книжки читать не охота, а поподробнее узнать охота...
А то книжки читать не охота, а поподробнее узнать охота..."An Operational Semantics for I/O in a Lazy Functional Language"
А это точно про то? А то по названию показалось, что это про манады...
Чувак строит отношения эквивалентности
между различными подходами к в/в, в т.ч. CPS.
Про монады там нет.
между различными подходами к в/в, в т.ч. CPS.
Про монады там нет.
По простому это вычисления функций без возврата. Т.е. вместо того, чтобы выполнять return мы вызываем так называемое continuation, которое нам передали в параметрах. Ну и сами, когда вызываем подфункцию, передаем ей остаток текущей функции в качестве continuation. В этих continuation сохраняется контекст вычисления и мы, если нужно, можем прервать текущее вычисление и вернуться назад, как при использовании longjump, или даже в другую ветку. Так получается, что не нужен стек. Есть даже какой-то язык типа Stackless Python или Perl.
В императивных языках это понятно как происходит, а в функциональных не очень.
В императивных языках это понятно как происходит, а в функциональных не очень.
По простому это вычисления функций без возврата. Т.е. вместо того, чтобы выполнять return мы вызываем так называемое continuation, которое нам передали в параметрах.Ох, ниибаца. Помню я несколько дней такое делал на perl и чуть с ума не сошел. Такой прикольный монстр вышел, сам факт его работы удивлял.
squid видел?
там CPS в чистом виде
(это я про версию 2)
довольно трудно прослеживать последовательность операций
там CPS в чистом виде
(это я про версию 2)
довольно трудно прослеживать последовательность операций
А вот такая штука.
В случае функционального языка у компилятора вроде вполне достаточно информации,
чтобы преобразовывать co-routines (которые как правило удобнее писать человеку) в CPS
(что удобнее исполнять компьютеру). А вот на практике этого как добиться?
"В сях" люди как правило треды вводят для этого дела, с соответствующим оверхедом.
В случае функционального языка у компилятора вроде вполне достаточно информации,
чтобы преобразовывать co-routines (которые как правило удобнее писать человеку) в CPS
(что удобнее исполнять компьютеру). А вот на практике этого как добиться?
"В сях" люди как правило треды вводят для этого дела, с соответствующим оверхедом.
Я не в курсе. Я пытаюсь пока понять, реализацию CPS на Haskell. Я скачал документ с объяснениями для Scheme, но я его не знаю и поэтому все равно не понятно.
Оставить комментарий
oleg_mcp
Нет ли у кого хороших статей/книг по этому делу? Лучше на примере функциональных языков, поскольку с императивными и так более-менее понятно.