Декларативный язык для сложных потоков данных?
декларативные языки для описания последовательности командгде-то здесь противоречие
Make же
где-то здесь противоречиемонадическая запись?
в fort/lisp: низкоуровневость,
уже есть в питоне.
Как всегда универсальный ответ: такая библиотечка где-то здесь противоречиесогласен. переформулировал по другому
Для описания сложных потоков данных требуется
размножение (аналог в 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 и синтаксис
lisp - как язык низкоуровневый. lisp + либы - уже можно считать высокоуровневым (если не брать в расчет синтаксис)
Как всегда универсальный ответ: такая библиотечка уже есть в питоне.таких библиотечек сотни под каждый язык, но они про другое.
lisp - как язык низкоуровневый.
Это потому что там итерации изначально нет?
таких библиотечек сотни под каждый язык, но они про другое.А такая ?
там много чего нет.
А такая ?таких тоже много.
Неудобно в них то, что мы записываем не сами data-flow-преобразования, а императивный код по построению data-flow-преобразований.
Неудобно в них то, что мы записываем не сами data-flow-преобразования, а императивный код по построению data-flow-преобразований.Ну а чо делать, лисп-то ты не осилил.
Ну а чо делать, лисп-то ты не осилил.заведомо неверное утверждение
ps
в лиспе нет того, что мне хочется.
в лиспе нет того, что мне хочется.Вшмышле макросов?
1. внутреннее представление (AST) было отделено от представления в виде текста
2. стандартизованы data-control-блоки
3. стандартизован AST и синтаксис
Ну я и говорю не осилил.
proof будет?
Программирование и есть построение преобразований данных, так что ты упоролся. Языки отличаются только набором элементарных операций преобразований, для каких-то задач хороши одни наборы, для других другие. Нет только универсального набора (хотя лисп позволяет создать дсл на все случаи жизни).
Программирование и есть построение преобразований данных, так что ты упоролся.если всё было бы так просто, то был бы один идеальный язык.
ps
в императивных языках - потоки данных, вообще, очень вскользь рассматриваются. В ФЯ с этим, конечно, много лучше, но многие аспекты всё равно за кадром остаются.
В императивных языках вполне себе есть потоки данных, просто атомарные операции над ними довольно простые. Конечно, за счет этого достигается большая универсальность и эффективность.
В императивных языках вполне себе есть потоки данных,их нет в явном виде. и соответственно, и не предлагается никакой алгебры по работе с потоками данных.
ps
наверное, я зря не зафиксировал, что рассматриваются потоки данных с устойчивой во времени структурой (при практическом программировании они обычно только такие и бывают что позволяет делать всякие хитрые штуки.
Не может быть одного языка, потому что структура данных, обычно, очень разная.так вопрос и звучит, какие есть специализированные наработки под структуры данных, которые являются поточными? т.е. не под всякие структуры данных, а под строго определенные.
Ну на джаве понаписаны библы с хмл дслем на основе enterprise integration patterns, в принципе норм.
мне так кажется, что стоит искать в области хаскеля. Там должно быть как минимум три библиотеки для построения подобных структур. И даже не обязательно привлекать template haskell для этого
proof будет?Пруф чего? Замени функции лиспа макросами = переименуй, будет тебе отделение AST от кода, если вдруг такой упоротый.
будет тебе отделение AST от кодане будет.
будет, еще переводов строки навставляй и в отдельный файл запихни.
попробуй подумать: зачем необходимо отделение AST-а от представления кода.
попробуй подумать: зачем необходимо отделение AST-а от представления кода.Зачем тебе необходимо? Потому что ты упоротый, конечно.
Хочешь какую-то хрень вместо того чтоб нормально написать задачку, которую пытаешься решить.
нормально написать задачку, которую пытаешься решить.задача простая: описать большой DataFlow и уметь над ним делать всякие автоматизированные преобразования (адаптация, высокоуровневая оптимизация, раскидывание по нодам и т.д.)
задача простая: описать большой DataFlow и уметь над ним делать всякие автоматизированные преобразования (адаптация, высокоуровневая оптимизация, раскидывание по нодам и т.д.)попробуй подумать: зачем необходимо отделение AST-а от представления кода.
для увеличения плотности записи кода без усложнения парсера и преобразователей кода.
для увеличения плотности записи кода без усложнения парсера и преобразователей кода.Ну вот, как я и говорил — упоротый
Чем выше плотность - тем проще увидеть и сделать большие изменения кода.
Чем выше плотность - тем проще увидеть и сделать большие изменения кода.
Чем выше плотность - тем проще увидеть и сделать большие изменения кода.
%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
ps
в обоих примерах высокая плотность шума, а не информационности.
задача простая: описать большой DataFlow и уметь над ним делать всякие автоматизированные преобразования (адаптация, высокоуровневая оптимизация, раскидывание по нодам и т.д.)Haxl?
в лиспе нет того, что мне хочется.О, а приведи пример, плз.
О, а приведи пример, плз.1. недостаточная информационная плотность записи
2. малое кол-во концепций и метафор, встроенных в язык => готовая масса кода поддерживает малое кол-во общих правил "игры"
Haxl?о нем есть только презентация?
2. малое кол-во концепций и метафор, встроенных в язык => готовая масса кода поддерживает малое кол-во общих правил "игры"
Гм.
Назови тогда хоть одно правило "игры", которое "масса кода" не поддерживает.
Потом я скажу, что для всего в лиспе есть макросы, а ты скажешь, что макроопределение на пятнадцать строчек — это не тру, и не не входит в концепции и метафоры.
Назови тогда хоть одно правило "игры", которое "масса кода" не поддерживает.статическая типизация
Потом я скажу, что для всего в лиспе есть макросы, а ты скажешь, что макроопределение на пятнадцать строчек — это не тру, и не не входит в концепции и метафоры.если эти 15 строчек научат всю остальную массу кода играть по правилам, то - welcome (но, к сожалению, это теоретически невозможно)
статическая типизацияА, ну ладно.
Теги в кложе этого не заменяют, конечно.
в fort/lisp: низкоуровневость,
статическая типизацияНапоминает мне, как один человек утверждал, что все что не integer, это и есть inexact.
Два перпендикулярных понятия же.
Статически типизированный Фортран сильно высокоуровневый?
если же брать другие высокоуровневые концепции, которых нет в лиспе, то это:
ФЯ
1. чистота
2. монадность ввода-вывода
ООП
1. объект/класс
2. dynamic dispatch
3. разграничение доступа
4. наследование реализации
5. декларация контракта
ps
и я предлагаю различать понятия: "zzz - является общепринятой базой в языке xxx" и "zzz можно реализовать на языке xxx". Второе мало о чем говорит, потому что всё что угодно можно сделать на любом тьюринг полном языке (включая, тот же маш. код но это совсем не означает, что маш. код является высокоуровневым языком.
нет в лиспе
ООП
нет в лиспе
1. чистота
и 15-ти строчный макрос это не сможет исправить.
от того, что ООП идет в разрез с идеологией Лисп - ООП не перестает быть высокоуровневой концепцией.
от того, что ООП идет в разрез с идеологией Лисп - ООП не перестает быть высокоуровневой концепцией.Нет, мне просто в этой фразе непонятны следующие определения: "ООП", "идеология", "Лисп", "вразрез". Спасибо.
Разверни, пожалуйста, свою удивление по "нет в Лиспе и ООП"
ps
и я не утверждал, что в Лиспе нет ООП, я утверждал, что в Лиспе нет следующих концепций ООП
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 dispatchhttp://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)
Если брать среднюю lisp-либу из инета: она будет под common lisp или под closure?
ps
разговор опять переходит в плоскость "как это можно сделать?", но ведь изначально вопрос стоял по другому "Если брать готовый код с инета, то в нем эти концепции поддерживаются? или нет?"
Без понимания важности этого и получается, что на одном небольшом проекте:
У нас были три разных версии строк, два пакета для работы с Юникодом, три фреймворка для логирования,и это только на осязаемых вещах.
С высокоуровневыми концепциями всё обычно хуже: по проекту раскидываются десятки недореализаций наследования, контрактов, метаописаний данных, плагинов, IoC, обобщенных преобразований данных и т.д.
и, соответственно, советы "благодаря Xxx вы легко можете запилить стосемнадцатую реализацию Zzz" никоим образом не помогают при решении вышеуказанной проблемы, а лишь ее усугубляют.
если у тебя есть десятки тысяч разработчиков, работающих над какой-то новой задачей, которую тут никто раньше не решал, то как они будут делать, то и станет стандартом - это их код будут скачивать из интернета, а не наоборот
если у тебя есть десятки тысяч разработчиков, работающих над какой-то новой задачей, которую тут никто раньше не решал, то как они будут делать, то и станет стандартом - это их код будут скачивать из интернета, а не наоборотдесятки тысяч разработчиков обычно уже не имеют единого руководства. И, соответственно, приказом их не заставишь писать одинаково.
Вот удобная либа, ее использование в паре успешных проектах и широкая реклама может помочь
closure - это не common lisp.Однако в обоих есть ООП, или ты о чем?
разговор опять переходит в плоскость "как это можно сделать?", но ведь изначально вопрос стоял по другому "Если брать готовый код с инета, то в нем эти концепции поддерживаются? или нет?"Ой, да, пять строчек — это долго, сложно и страшно.
Ой, да, пять строчек — это долго, сложно и страшно.эти 5 строчек не добавят поддержку концепции в существующий код.
Вот удобная либа, ее использование в паре успешных проектах и широкая реклама может помочьу тебя какая-то хитрая секретная задача, которую ты не хочешь или не можешь сформулировать, а только туману нагоняешь
наверное, если ты не смог найти удобную либу, то её пока нет - значит тебе и делать её
эти 5 строчек не добавят поддержку концепции в существующий код.Правда?
То есть в нашем мире еще нет ни делегации, ни замыканий, и вообще все очень сурово и викинги с ручными медведями?
У тебя какие-то не те представления о модульности и объектности.
Правда?если в коде используется два вида строк, то никакими 5-ью строчками не сделаешь так, чтобы этот код использовал один вид строк.
что уж говорить про более сложные абстракции.
у тебя какая-то хитрая секретная задача, которую ты не хочешь или не можешь сформулировать, а только туману нагоняешья ее сформулировал на том уровне общности, который мне интересен. Более частные способы интересны только, если они дают наметки для решения в общем виде.
если в коде используется два вида строк, то никакими 5-ью строчками не сделаешь так, чтобы этот код использовал один вид строк.WAT
1. потери производительности на стыках (требуется переконвертация одной реализации концепции в другую)
2. сложность с дальнейшим обобщением - тяжело формулируется единая метафора, которая одинаково хорошо вмещает в себя оба варианта реализации
3. увеличение объема кода (и трудоемкости по разработке и обслуживании) - обслуживающий код должен уметь работать с обоими вариантами
2. сложность с дальнейшим обобщением - тяжело формулируется единая метафора, которая одинаково хорошо вмещает в себя оба варианта реализацииНу мне кажется, в лиспе единые метафоры довольно неплохо должны.
Information hiding, кстати, есть на уровне библиотек.
я ее сформулировал на том уровне общности, который мне интересен. Более частные способы интересны только, если они дают наметки для решения в общем виде.Это сугубо твой внутренний, теоретический интерес?
Это сугубо твой внутренний, теоретический интерес?внутренний практический. Если был бы ответ, то я бы его внедрил, а при отсутствии ответа - сделаю велосипед (но скорее всего примитивный под конкретную задачу)
Оставить комментарий
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 и синтаксис