Я пытаюсь реализовать структуру списка, читающую дерево каталогов FileSystem, используя node.js
DIR / файловая структура:
DIR1
DIR2R
file1
file2
file3
…
-> структура списка:
("DIR1" ("DIR2" "file1" "file2" "file3" …))
DIR() //looks like a C function
file //looks like an Atom value
так, например, данный корневой DIR UNIX:
root bin cd
ls
lib file1
file2
opt
usr file3
file4
эквивалентен списку:
("root" ("bin" ("cd" "ls")
"lib" ("file1" "file2")
"opt" ()
"usr" ("file3")
"file4"
)
)
Сказав это, я хочу реализовать этот код с помощью некоторой ленивой асинхронной последовательности (поток / бесконечный список?).
рекурсивный поиск в каталоге node.js fs.readdir - это хорошая ссылка.
node.js имеет множество отличных библиотек, таких как file.walk и т. д. , но это очень интересная тема, на самом деле существует множество примеров кода.
Другими словами, хороший предмет для изучения базовой концепции ленивой асинхронной последовательности (поток / бесконечный список?), А код может быть хорошей библиотекой, которую я хочу реализовать с нуля.
substack / stream-handbook охватывает основы написания программ на node.js с потоки. Действительно отличная статья.
Итак, вот моя мысль по этому поводу - Рекурсивная обработка дерева Dir:
Эта тема связана с рекурсивным поиском, и существует 2 способа: асинхронный и синхронный, по разным причинам я выбрал метод асинхронный.
Результат поиска эквивалентен структуре списка, где имеет значение парадигма функционального программирования (Lisp / Scheme).
Для функционального программирования JavaScript существуют такие библиотеки, как underscore.js, а недавно и < strong> lazy.js с одним важным отличием: ленивое вычисление strong> (также известное как отложенное выполнение), где превосходит underscore.js.
lazy.js также включает потоковую обработку в Node.js. Я также обнаружил, что stream.js говорит: бесконечное количество элементов. Их сила заключается в том, что их лениво оценивают, что, говоря простым языком, означает, что они могут содержать бесконечное количество элементов..
Потоковые данные (бесконечный список) реализуют парадигму Реактивного функционального программирования (FRP). lazy.js фактически демонстрирует реализацию FRP события мыши. RxJS - это библиотека FRP: RxJS или реактивные расширения для JavaScript - это библиотека для преобразования, составления и запроса потоков данных.
async этого предмета является предметом FRP.
Следовательно, ленивая оценка является основным фактором более быстрой обработки списка функционального программирования и расширяет список до бесконечного списка (потока), который интегрирует асинхронные / события в источник данных потока для обработки в парадигме функционального программирования (FunctionalReactiveProgramming).
node-lazy Введение четко заявляет: Lazy приходит на самом деле удобно, когда вам нужно обработать поток событий как список. Наилучшим вариантом использования в настоящее время является возврат ленивого списка из асинхронной функции и передача данных в него через события. В асинхронном программировании вы не можете просто вернуть обычный список, потому что у вас еще нет данных для него. Обычным решением до сих пор было предоставление обратного вызова, который вызывается, когда данные доступны. Но, делая это таким образом, вы теряете возможность связывать функции и создавать каналы, что приводит к не очень приятным интерфейсам. (См. Второй пример ниже, чтобы увидеть, как он улучшил интерфейс в одном из моих модулей.)
Наконец, вот мой вопрос по этой теме - Рекурсивная обработка дерева Dir:
Есть ли какой-либо образец кода для реализации этой темы исключительно в режиме отложенной оценки или в стиле FRP?
Я знаю, что lazy.js, stream.js или linq.js основаны на ленивой оценке, но ни один из них не может определить node.js fs.readdir как данные потока для асинхронной обработки (FRP) . Согласно http://danieltao.com/lazy.js/docs/AsyncSequence.html, это еще не реализовано, правильно?
RxJS, вероятно, сможет, но я не знаю как.
Google rx.Observable fs.readdir ничего не обнаруживает.
Любые идеи?