metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-10-20 01:28 pm
Entry tags:

Iteratees c обратной связью

В Iteratees обратная связь от iteratee к enumerator реализована хитрым образом - через исключения. Т.е. кидается исключение с данными, которые нужно обработать в источнике данных, например, указатель для рандомного seek в файле, оно перехватывается енумератором-источником данных и обрабатывается.

Мне видимо, придется посылать команды ком-порту в том же стиле, но вообще надо еще посушить мозги над структурой типов используемых в Iteratees, чтобы понять, почему сделано именно так, а не иначе.
Ну и посмотреть, как пакет enumerator используется в Yesod, на предмет того же - как они читают из сокета и пишут в него ответ.

[identity profile] gds.livejournal.com 2011-10-20 11:21 am (UTC)(link)
обратную связь с enumerator сделали так, потому что самое простое-тупое.
Но кто заставляет использовать именно такую схему?
Я на ocaml+lwt+iteratees вполне пользуюсь тем, что iteratees у меня построены поверх манатки, в том числе io-подобной, и спокойно шлю данные через io-функции, выполняя их lift в манатку итератов.
Для других же целей (там, где restful) -- на каждый запрос запускаю по итерату, они возвращают ответ, который я отправляю в нужный output_channel (неизвестный, на всякий случай, обрабатывающему итерату).
Для более-менее общего расклада я бы предложил что-то типа итерата, хранящего внутри текущее состояние и, когда будет готов его ответ, возвращающего как сам ответ, так и итерат, который должен быть запущен в этой же "сессии общения" в качестве обработчика следующей команды. Цимес итератов соблюдён -- никаких явных манипуляций и вообще выдачи наружу промежуточных состояний.

[identity profile] permea-kra.livejournal.com 2011-10-21 07:48 am (UTC)(link)
Возьмите coroutines. Честное слово, оно проще.