Декларативный язык для сложных потоков данных?

Dasar

Для описания сложных потоков данных требуется
  размножение (аналог в control flow - foreach, map
  вариативность (в control flow - тернарный условный оператор, if, switch, pattern-matching
  вариативность по ошибке (в control flow - throw/catch, монада
  переиспользуемые блоки (в control flow - функции, процедуры, лямбды)
(все эти конструкции назовем data-control блоками)
Какие есть готовые декларативные языки для описания сложных потоков данных, поддерживающие эти возможности?
всё что я знаю не совсем подходит под то, что хочется:
1. spreadsheet languages (excel, calc и т.д.) - почти совсем нет ничего из перечисленного
2. языки для описания сборочных скриптов
  a) xml-based : Ant, msbuild - громоздкая запись
  b) make и т.д. - нестандартизованное внутреннее представление, заточенность под файловую систему, слабые возможности по декомпозиции
3. функциональное подмножество универсальных языков - низкая заточенность под декларативность
в идеале, хочется чтобы:
1. внутреннее представление (AST) было отделено от представления в виде текста
2. стандартизованы data-control-блоки
3. стандартизован AST и синтаксис

Marinavo_0507

декларативные языки для описания последовательности команд
где-то здесь противоречие

artimon

Make же :)

yroslavasako

где-то здесь противоречие
монадическая запись?

apl13

в fort/lisp: низкоуровневость,
:ooo:

pilot

Как всегда универсальный ответ: такая библиотечка уже есть в питоне. :grin:

Dasar

где-то здесь противоречие
согласен. переформулировал по другому
Для описания сложных потоков данных требуется
размножение (аналог в control flow - foreach, map
вариативность (в control flow - тернарный условный оператор, if, switch, pattern-matching
вариативность по ошибке (в control flow - throw/catch, монада
переиспользуемые блоки (в control flow - функции, процедуры, лямбды)
(все эти конструкции назовем data-control блоками)
Какие есть готовые декларативные языки для описания сложных потоков данных, поддерживающие эти возможности?
всё что я знаю не совсем подходит под то, что хочется:
1. spreadsheet languages (excel, calc и т.д.) - почти совсем нет ничего из перечисленного
2. языки для описания сборочных скриптов
a) xml-based : Ant, msbuild - громоздкая запись
b) make и т.д. - нестандартизованное внутреннее представление, заточенность под файловую систему, слабые возможности по декомпозиции
3. функциональное подмножество универсальных языков - низкая заточенность под декларативность
в идеале, хочется чтобы:
1. внутреннее представление (AST) было отделено от представления в виде текста
2. стандартизованы data-control-блоки
3. стандартизован AST и синтаксис

Dasar

lisp - как язык низкоуровневый. lisp + либы - уже можно считать высокоуровневым (если не брать в расчет синтаксис)

Dasar

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

apl13

lisp - как язык низкоуровневый.
:ooo:
Это потому что там итерации изначально нет? :ooo:

pilot

таких библиотечек сотни под каждый язык, но они про другое.
А такая ? :D

Dasar

там много чего нет.

Dasar

А такая ? :D
таких тоже много.
Неудобно в них то, что мы записываем не сами data-flow-преобразования, а императивный код по построению data-flow-преобразований.

pilot

Неудобно в них то, что мы записываем не сами data-flow-преобразования, а императивный код по построению data-flow-преобразований.
Ну а чо делать, лисп-то ты не осилил.

Dasar

Ну а чо делать, лисп-то ты не осилил.
заведомо неверное утверждение
ps
в лиспе нет того, что мне хочется.

pilot

в лиспе нет того, что мне хочется.
Вшмышле макросов? :o

Dasar

1. внутреннее представление (AST) было отделено от представления в виде текста
2. стандартизованы data-control-блоки
3. стандартизован AST и синтаксис

pilot

Ну я и говорю не осилил.

Dasar

proof будет?

Papazyan

Программирование и есть построение преобразований данных, так что ты упоролся. Языки отличаются только набором элементарных операций преобразований, для каких-то задач хороши одни наборы, для других другие. Нет только универсального набора (хотя лисп позволяет создать дсл на все случаи жизни).

Dasar

Программирование и есть построение преобразований данных, так что ты упоролся.
если всё было бы так просто, то был бы один идеальный язык.
ps
в императивных языках - потоки данных, вообще, очень вскользь рассматриваются. В ФЯ с этим, конечно, много лучше, но многие аспекты всё равно за кадром остаются.

Papazyan

Не может быть одного языка, потому что структура данных, обычно, очень разная. Это как считать, что нет разницы на чем играть - на скрипке или саксофоне. Один язык, который вмещал бы все юз кейсы, был бы нереально сложным.
В императивных языках вполне себе есть потоки данных, просто атомарные операции над ними довольно простые. Конечно, за счет этого достигается большая универсальность и эффективность.

Dasar

В императивных языках вполне себе есть потоки данных,
их нет в явном виде. и соответственно, и не предлагается никакой алгебры по работе с потоками данных.
ps
наверное, я зря не зафиксировал, что рассматриваются потоки данных с устойчивой во времени структурой (при практическом программировании они обычно только такие и бывают что позволяет делать всякие хитрые штуки.

Dasar

Не может быть одного языка, потому что структура данных, обычно, очень разная.
так вопрос и звучит, какие есть специализированные наработки под структуры данных, которые являются поточными? т.е. не под всякие структуры данных, а под строго определенные.

Papazyan

Ну на джаве понаписаны библы с хмл дслем на основе enterprise integration patterns, в принципе норм.

yroslavasako

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

pilot

proof будет?
Пруф чего? Замени функции лиспа макросами = переименуй, будет тебе отделение AST от кода, если вдруг такой упоротый.

Dasar

будет тебе отделение AST от кода
не будет.

pilot

будет, еще переводов строки навставляй и в отдельный файл запихни.

Dasar

попробуй подумать: зачем необходимо отделение AST-а от представления кода.

pilot

попробуй подумать: зачем необходимо отделение AST-а от представления кода.
Зачем тебе необходимо? Потому что ты упоротый, конечно.
Хочешь какую-то хрень вместо того чтоб нормально написать задачку, которую пытаешься решить. :D

Dasar

нормально написать задачку, которую пытаешься решить.
задача простая: описать большой DataFlow и уметь над ним делать всякие автоматизированные преобразования (адаптация, высокоуровневая оптимизация, раскидывание по нодам и т.д.)

pilot

задача простая: описать большой DataFlow и уметь над ним делать всякие автоматизированные преобразования (адаптация, высокоуровневая оптимизация, раскидывание по нодам и т.д.)
попробуй подумать: зачем необходимо отделение AST-а от представления кода.

Dasar

для увеличения плотности записи кода без усложнения парсера и преобразователей кода.

pilot

для увеличения плотности записи кода без усложнения парсера и преобразователей кода.
Ну вот, как я и говорил — упоротый :D

Dasar

это не прихоть.
Чем выше плотность - тем проще увидеть и сделать большие изменения кода.

pilot

Чем выше плотность - тем проще увидеть и сделать большие изменения кода.

zorin29

Чем выше плотность - тем проще увидеть и сделать большие изменения кода.

%DTC
%DTC ; SF/XAK - DATE/TIME OPERATIONS ;1/16/92 11:36 AM
;;19.0;VA FileMan;;Jul 14, 1992
D I 'X1!'X2 S X="" Q
S X=X1 D H S X1=%H,X=X2,X2=%Y+1 D H S X=X1-%H,%Y=%Y+1&X2
K %H,X1,X2 Q
;
C S X=X1 Q:'X D H S %H=%H+X2 D YMD S:$P(X1,".",2) X=X_"."_$P(X1,".",2)
K X1,X2 Q
S S %=%100+(%#3600\60)/100+(%\3600)/100 Q
;
H I X<1410000 S %H=0,%Y=-1 Q
S %Y=$E(X,1,3%M=$E(X,4,5%D=$E(X,6,7)
S %T=$E(X_0,9,10)*60+$E(X_"000",11,12)*60+$E(X_"00000",13,14)
TOH S
%H=%M>2&'(%Y#4)+$P("^31^59^90^120^151^181^212^243^273^304^334","^",%M)+%D
S %='%M!'%D,%Y=%Y-141,%H=%H+(%Y*365)+(%Y\4)-(%Y>59)+%,%Y=$S(%:-
1,1:%H+4#7)
K %M,%D,% Q
;
DOW D H S Y=%Y K %H,%Y Q
DW D H S Y=%Y,X=$P("SUN^MON^TUES^WEDNES^THURS^FRI^SATUR","^",Y+1)_"DAY"
S:Y<0 X="" Q
7 S %=%H>21608+%H-.1,%Y=%\365.25+141,%=%25\1
S %D=%+306#(%Y#4=0+365)#153#61#31+1,%M=%-%D\29+1
S X=%Y_"00"+%M_"00"+%D Q
;
YX D YMD S Y=X_% G DD^%DT
YMD D 7 S %=$P(%H,",",2) D S K %D,%M,%Y Q
T F %=1:1 S Y=$E(X,%) Q:"+-"[Y G 1^%DT:$E("TODAY",%)'=Y
S X=$E(X,%+1,99) G PM:Y="" I +X'=X D DMW S X=%
G:'X 1^%DT
PM S @("%H=$H"_Y_X) D TT G 1^%DT:%I(3)'?3N,D^%DT
N F %=2:1 S Y=$E(X,%) Q:"+-"[Y G 1^%DT:$E("NOW",%)'=Y
I Y="" S %H=$H G RT
S X=$E(X,%+1,99)
I X?1.N1"H" S X=X*3600,%H=$H,@("X=$P(%H,"","",2)"_Y_X%=$S(X<0:-
1,1:0)+(X\86400X=X%H=$P(%H,",")+%_","_X G RT
D DMW G 1^%DT:'% S @("%H=$H"_Y_%%H=%H_","_$P($H,",",2)
RT D TT S %=$P(%H,",",2) D S S %=X_% I %DT'["S" S %=+$E(%,1,12)
Q:'$D(%(0 S Y=% G E^%DT
PF S %H=$H D YMD S %(9)=X,X=%DT["F"*2-1 I @("%I(1)*100+%I(2)"_$E(">
<",X+2)_"$E(%(94,7)") S %I(3)=%I(3)+X
Q
TT D 7 S %I(1)=%M,%I(2)=%D,%I(3)=%Y K %M,%D,%Y Q
NOW S %H=$H,%H=$S($P(%H,",",2):%H,1:%H-1)
D TT S %=$P(%H,",",2) D S S %=X_$S(%:%,1:.24) Q
DMW S %=$S(X?1.N1"D":+X,X?1.N1"W":X*7,X?1.N1"M":X*30,+X=X:X,1:0)
Q

Dasar

вы как-то странно считаете информационную плотность кода.
ps
в обоих примерах высокая плотность шума, а не информационности.

karkar

задача простая: описать большой DataFlow и уметь над ним делать всякие автоматизированные преобразования (адаптация, высокоуровневая оптимизация, раскидывание по нодам и т.д.)
Haxl?

apl13

в лиспе нет того, что мне хочется.
О, а приведи пример, плз.

Dasar

О, а приведи пример, плз.
1. недостаточная информационная плотность записи
2. малое кол-во концепций и метафор, встроенных в язык => готовая масса кода поддерживает малое кол-во общих правил "игры"

Dasar

Haxl?
о нем есть только презентация?

apl13

2. малое кол-во концепций и метафор, встроенных в язык => готовая масса кода поддерживает малое кол-во общих правил "игры"
:ooo:
Гм.
Назови тогда хоть одно правило "игры", которое "масса кода" не поддерживает.
Потом я скажу, что для всего в лиспе есть макросы, а ты скажешь, что макроопределение на пятнадцать строчек — это не тру, и не не входит в концепции и метафоры.

Dasar

Назови тогда хоть одно правило "игры", которое "масса кода" не поддерживает.
статическая типизация
Потом я скажу, что для всего в лиспе есть макросы, а ты скажешь, что макроопределение на пятнадцать строчек — это не тру, и не не входит в концепции и метафоры.
если эти 15 строчек научат всю остальную массу кода играть по правилам, то - welcome (но, к сожалению, это теоретически невозможно)

apl13

статическая типизация
А, ну ладно.
Теги в кложе этого не заменяют, конечно.

apl13

в fort/lisp: низкоуровневость,
статическая типизация
Напоминает мне, как один человек утверждал, что все что не integer, это и есть inexact.
Два перпендикулярных понятия же.
Статически типизированный Фортран сильно высокоуровневый?

Dasar

статическую типизацию в качестве ответа я выбрал лишь потому, что на это сложно что-то возразить.
если же брать другие высокоуровневые концепции, которых нет в лиспе, то это:
ФЯ
1. чистота
2. монадность ввода-вывода
ООП
1. объект/класс
2. dynamic dispatch
3. разграничение доступа
4. наследование реализации
5. декларация контракта
ps
и я предлагаю различать понятия: "zzz - является общепринятой базой в языке xxx" и "zzz можно реализовать на языке xxx". Второе мало о чем говорит, потому что всё что угодно можно сделать на любом тьюринг полном языке (включая, тот же маш. код но это совсем не означает, что маш. код является высокоуровневым языком.

apl13

нет в лиспе
ООП
:ooo:
нет в лиспе
1. чистота
:ooo:

Dasar

в лиспе, в отличии от того же haskell-а, беря либу мы не можем рассчитывать на то, что она является полностью чистой. И мало того, даже нет гарантированного способа получить инфу о чистоте конкретной функции.
и 15-ти строчный макрос это не сможет исправить.

Dasar

от того, что ООП идет в разрез с идеологией Лисп - ООП не перестает быть высокоуровневой концепцией.

apl13

от того, что ООП идет в разрез с идеологией Лисп - ООП не перестает быть высокоуровневой концепцией.
Нет, мне просто в этой фразе непонятны следующие определения: "ООП", "идеология", "Лисп", "вразрез". Спасибо.

Dasar

лучше тогда вернуться на пост назад чтобы уменьшить растекания по древу
Разверни, пожалуйста, свою удивление по "нет в Лиспе и ООП"
ps
и я не утверждал, что в Лиспе нет ООП, я утверждал, что в Лиспе нет следующих концепций ООП

apl13

1. объект/класс
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
2. dynamic dispatch
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
(define (dispatch this . args)
(cond
string? this) (display this) (for-each display args) (newline
number? this) (display (apply + this args
boolean? this) (if this (car args) (cadr args
(else (display "Some fresh type"

dispatch #t (lambda (dispatch "Hello, " "world!" (lambda (dispatch 32 10

3. разграничение доступа
В R6RS, насколько я помню, есть в библиотеке рекордов.
4. наследование реализации
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
http://clojure.github.io/clojure/clojure.core-api.html#cloju...
5. декларация контракта
Как-нибудь так нельзя?
(define (call-contract pre f post)
(lambda args (and (apply pre args)
(let ret-val (apply f args
(and (post ret-val) ret-val

(define add-pos
(call-contract
(lambda args
(let pos? args args (or (null? args) (and (positive? (car args (pos? (cdr args
+
(lambda (ret-val) (< ret-val 42

(display (add-pos 10 10 5 (newline)
(display (add-pos 10 10 22 (newline)
(display (add-pos 5 5 -2 (newline)

Dasar

closure - это не common lisp.
Если брать среднюю lisp-либу из инета: она будет под common lisp или под closure?
ps
разговор опять переходит в плоскость "как это можно сделать?", но ведь изначально вопрос стоял по другому "Если брать готовый код с инета, то в нем эти концепции поддерживаются? или нет?"

Dasar

я вижу, что сильно недооценивается организационная составляющая: обеспечить, чтобы десятки - десятки тысяч разработчиков писали код в единой реализации концепции.
Без понимания важности этого и получается, что на одном небольшом проекте:
У нас были три разных версии строк, два пакета для работы с Юникодом, три фреймворка для логирования,
и это только на осязаемых вещах.
С высокоуровневыми концепциями всё обычно хуже: по проекту раскидываются десятки недореализаций наследования, контрактов, метаописаний данных, плагинов, IoC, обобщенных преобразований данных и т.д.
и, соответственно, советы "благодаря Xxx вы легко можете запилить стосемнадцатую реализацию Zzz" никоим образом не помогают при решении вышеуказанной проблемы, а лишь ее усугубляют.

Marinavo_0507

если у тебя есть десятки тысяч разработчиков, работающих над какой-то новой задачей, которую тут никто раньше не решал, то как они будут делать, то и станет стандартом - это их код будут скачивать из интернета, а не наоборот

Dasar

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

apl13

closure - это не common lisp.
Однако в обоих есть ООП, или ты о чем?

apl13

разговор опять переходит в плоскость "как это можно сделать?", но ведь изначально вопрос стоял по другому "Если брать готовый код с инета, то в нем эти концепции поддерживаются? или нет?"
Ой, да, пять строчек — это долго, сложно и страшно.

Dasar

Ой, да, пять строчек — это долго, сложно и страшно.
эти 5 строчек не добавят поддержку концепции в существующий код.

Marinavo_0507

Вот удобная либа, ее использование в паре успешных проектах и широкая реклама может помочь
у тебя какая-то хитрая секретная задача, которую ты не хочешь или не можешь сформулировать, а только туману нагоняешь
наверное, если ты не смог найти удобную либу, то её пока нет - значит тебе и делать её

apl13

эти 5 строчек не добавят поддержку концепции в существующий код.
Правда?
То есть в нашем мире еще нет ни делегации, ни замыканий, и вообще все очень сурово и викинги с ручными медведями?
У тебя какие-то не те представления о модульности и объектности.

Dasar

Правда?
если в коде используется два вида строк, то никакими 5-ью строчками не сделаешь так, чтобы этот код использовал один вид строк.
что уж говорить про более сложные абстракции.

Dasar

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

apl13

если в коде используется два вида строк, то никакими 5-ью строчками не сделаешь так, чтобы этот код использовал один вид строк.
WAT

Dasar

два вида реализации концепции приводят к:
1. потери производительности на стыках (требуется переконвертация одной реализации концепции в другую)
2. сложность с дальнейшим обобщением - тяжело формулируется единая метафора, которая одинаково хорошо вмещает в себя оба варианта реализации
3. увеличение объема кода (и трудоемкости по разработке и обслуживании) - обслуживающий код должен уметь работать с обоими вариантами

apl13

2. сложность с дальнейшим обобщением - тяжело формулируется единая метафора, которая одинаково хорошо вмещает в себя оба варианта реализации
Ну мне кажется, в лиспе единые метафоры довольно неплохо должны.
Information hiding, кстати, есть на уровне библиотек.

6yrop

я ее сформулировал на том уровне общности, который мне интересен. Более частные способы интересны только, если они дают наметки для решения в общем виде.
Это сугубо твой внутренний, теоретический интерес?

Dasar

Это сугубо твой внутренний, теоретический интерес?
внутренний практический. Если был бы ответ, то я бы его внедрил, а при отсутствии ответа - сделаю велосипед (но скорее всего примитивный под конкретную задачу)
Оставить комментарий
Имя или ник:
Комментарий: