LINUX.ORG.RU

В каких высокоуровневых языках программирования есть пайпы и конвеер?

 ,


1

2

Доброго времени суток

Пощупал powershell ( под linux тоже есть ) и был приятно удивлён тем, что внутри есть конвееры. Даже то, что он работает с объектами, не так значительно.

Написал пару скриптов для vsphere и понимаю, что на любом другом языке несколько пайпов пришлось бы менять на трёхэтажные циклы. Код по сравнению с конвеером крайне раздувается и становится менее читаемым. Да, вместо циклов можно взять например лямбды. Но они тоже усложняют код. Возможно, даже больше циклов. На перле уже 2-3 вложенных map'а переполняют стек в голове :)

Да, можно взять старый добрый bash. Но любой пайп порождает процессы. И что хуже, более-менее сложную обработку данных приходится переносить на другие языки. И чтобы объединить такие куски кода в конвеер, придётся оформлять их в виде отдельных файлов. Хотелось бы что-то высокоуровневое вроде питона

Так вот. Есть ли высокоуровневые языки, в которых можно использовать пайпы для объединения в конвеер отдельных частей кода ? Или хотя бы можно организовать что-то подобное конвееру без нагромождения кода

★★★★★

Последнее исправление: router (всего исправлений: 2)
Ответ на: комментарий от router

REXX же.

Хмм... Забыл добавить - «живой» :)

Сталкивался с этим «неживым» менее месяца назад, когда хотел виндовую сборку DoubleContact опакетить в MSI и нашёл для этой цели MakeMsi. В итоге плюнул и сделал вместо MSI обычный EXE через хорошо знакомый Inno Setup.

Так вот, в скриптах MakeMsi как раз REXX используется (но отверг я его не из-за этого...)

hobbit ★★★★★
()

Любой язык, поддерживающий замыкания и расширения. C#, js, go Просто вызывая методы через точку.

nikolnik ★★★
()

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

1.Любой ML

2.В любом ООП языке можно лепить var.func1().func().func() и т.п. если функции возвращают объект

3.В крестах можно перегрузить operation|() и сделать сахарок.

4.В лиспе, и вообще везде где есть apply или аналог в т.ч. в питоне.

В общем надо сильно поискать современный язык, где это нельзя.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от router

роутер, ты таки приглядись к питону. у хаскеля всё очень удобно и красиво, но порог вхождения там высотой с многоэтажку. его и порогом то называть язык не поворачивается.

AndreyKl ★★★★★
()

А правильно ли фичи шелла и главное командлетов приписывать языку?

af5 ★★★★★
()

Чего люди только не сделают, лишь бы на js не писать.

А о твоей боли с 10гб логами - открой для себя streams и генераторы\итераторы в языках программирования высокого уровня. Предполагать, что ворочать большими объемами данных на ЯВУ в 2017 году - проблема - это очень странным надо быть.

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

Думаю, что имеется в виду что-то такое

Ну, вообще (.) — это и есть compose.

korvin_ ★★★★★
()

Можно ещё вспомнить о Tcl. В нём имеется команда chan pipe, которая на уровне скрипта создаёт пустой конвейер. Она возвращает два идентификатора каналов ввода-вывода; один участок кода может писать в этот канал обычной командой puts, а другой участок - читать командой read, ну и наоборот. В многопоточных приложениях можно даже перекидывать эти каналы между разными потоками и получится работа потоков, как запуск в Bash нескольких программ через |.

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

В окамле так же, но он православнее.

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

Чего люди только не сделают, лишь бы на js не писать.

Был у меня друг один. Всё на JavaScript писал. И клиент, и бэкенд, и десктоп даже. И базы данных на джаваскрипте делал, и игрушки клепал.
Говорил удобно, быстро, клёво. Всё работает, всё устраивает.
Ну, потом его в дурку сдали конечно…

CrossFire ★★★★★
()

C# - монада LINQ. В принципе, довольно похоже по идеологии, особенно Rx-расширения. Как ни странно - Go, каналы, и все такое, сюда же всякое Core.Async из Clojure итд. Синтаксис немного отличен, но суть +- та же. Вообще, читай SICP, называется это всё «абстракция на потоках».

В принципе, на любом языке можно соорудить. Вкратце - делаем некий объект «Task», у которого есть параметры и переменные, хранящиеся внутри. Пихаем в него некоторые объекты TaskAction, которые эти параметры достают, или же меняют, и что-то там делают в методах. Реализуем очередность выполнения TaskAction - все, вот тебе пайпы. Какой синтаксис к этому можно накрутить - уже зависит от мощности средств reflection, макросистемы итд. Можно даже в XML такое делать(я делал). Если в языке есть средства типа async/await, то вообще красота получается, с настоящей асинхронностью итд.

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