Commits

Anonymous committed 81225a9

init

Comments (0)

Files changed (3)

+output.txt : input.txt
+	litpro $^
+@ out text /doc output.txt
+@ set /ocaml/it1.ml
+
+@/doc
+Итераты -- общее описание.
+
+Итераты -- это способ разбора входящих потоков с элементами
+любых типов, позволяющий как прямую работу с массивами,
+содержащими поступающие на вход элементы (массив -- так называемый
+"чанк"), так и хорошо-композиционируемые комбинаторы, позволяющие
+на чанки смотреть только по необходимости (например, при желании
+соптимизировать код).
+
+Преимущества итератов:
+
+- они позволяют гарантировать много фактов, касающихся
+  ресурсопотребления (постоянная память самой "машинерии" итератов,
+  своевременное освобождение взятых ресурсов),
+
+- позволяют писать вполне декларативный код, если есть желание
+  выразить задачу в высокоуровневых терминах, и вполне низкоуровневый
+  код, работающий с чанками напрямую (который, например, можно вынести
+  даже в C),
+
+- могут работать как без монад (точнее, с тривиальной базовой
+  монадой Identity), так и с любыми монадами (например, успешно
+  работают с lwt),
+
+- не являются "исключительно парсерами" -- позволяют выполнять
+  любой требуемый код рядом с кодом, специфичным собственно для
+  итератов -- например, позволяют ввод-вывод через базовую монаду.
+  В случае, когда базовая монада это lwt или что-то параллельное,
+  они органично вклеиваются, позволяя параллельную обработку
+  нескольких потоков данных через lwt
+
+В итератах (в коде, в документации) типично используются следующие
+сущности:
+
+- итераты (тип iteratee), задача которых -- по входному чанку
+  вернуть результат работы и остаток неиспользованного чанка,
+  либо вернуть результат, интерпретируемый как "подайте мне ещё
+  данных, чтобы я смог выдать результат", либо вернуть ошибку.
+
+- энумераторы (тип enumerator), задача которых -- кормить итераты
+  входящими данными из произвольных источников, например, из файлов,
+  сокетов.  Они создают чанк с данными и передают его итерату.
+  Кроме того, в их задачи входит контроль ресурсов -- например,
+  энумератор, вызываемый с именем файла, содержимое которого
+  он будет давать итерату, закрывает этот файл по окончании работы
+  (при этом, не требует прочтения всего файла, если это не требуется
+  итерату, и читает файл чанками нужного размера, экономя на вводе-выводе,
+  в отличие от разбора ввода через монадный ввод-вывод, где каждая
+  команда вызывает ввод-вывод и, в случае lwt, опциональное переключение
+  работающего треда).
+
+- энумераты (тип enumeratee), представляющие собой снаружи те же
+  самые итераты -- принимают данные, которые внутри преобразовывают
+  в чанки, которые хочет видеть вложенный итерат, и скармливают их
+  вложенному итерату, таким образом, являясь прослойкой между реальным
+  входящим потоком данных и потоком, требуемым вложенному итерату.
+  (как простой пример -- если вложенный итерат читает utf8-символы,
+  а по условиям задачи нужно читать поток байтов, содержащих байтовые
+  представления этих символов, то энумерат, требующийся для решения
+  задачи, должен быть итератом, принимающим байты, и энумератором,
+  кормящим вложенный итерат чанками из utf8-символов).
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.