Реактивное программирование с циклами
От: . Великобритания  
Дата: 19.09.13 18:00
Оценка: 5 (1)
Насколько я видел имплементации РП, циклические зависимости не любят. Но они нередко бывают не только удобны, но и полезны. Классический пример:

даны формулы:
cell a = constant(0)
cell b = a + 10

обычно используют так:
a.set(5)
assert b == 15

А вот что я хочу ещё и так:
b.set(30)
assert a == 20

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

cell fullName = firstName + " " + lastName
cell firstName = fullName.split(" ")[0]
cell lastName = fullName.split(" ")[1]

и юзер может вводить как хочет, начиная с любого поля.
Если писать так в лоб, то будет столько скрытых косяков (например, что если пробелы будут в firstName), что лучше так не писать вовсе.

Какие есть наработки в этой области? Как это дело выражать красиво? Как например, верифицировать непротиворечивость формул? Как дебажить, тестить? Как определить — можно ли использовать такую формулу или надо что-то другое придумать?
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Реактивное программирование с циклами
От: Cyberax Марс  
Дата: 19.09.13 18:17
Оценка: 10 (1) +2
Здравствуйте, ., Вы писали:

.>Какие есть наработки в этой области? Как это дело выражать красиво? Как например, верифицировать непротиворечивость формул? Как дебажить, тестить? Как определить — можно ли использовать такую формулу или надо что-то другое придумать?

Линзы, однако. Т.е. собирать формулы из линз, для которых обратимость гарантирована.

http://www.wpi.edu/Pubs/ETD/Available/etd-042908-133033/unrestricted/cking.pdf
Sapienti sat!
Re[2]: Реактивное программирование с циклами
От: . Великобритания  
Дата: 19.09.13 18:31
Оценка:
Здравствуйте, Cyberax, Вы писали:

C> .>Какие есть наработки в этой области? Как это дело выражать красиво? Как например, верифицировать непротиворечивость формул? Как дебажить, тестить? Как определить — можно ли использовать такую формулу или надо что-то другое придумать?

C> Линзы, однако. Т.е. собирать формулы из линз, для которых обратимость гарантирована.
С другой стороны исключительная обратимость не всегда нужна. С тем же примером fullname например, можно описать так, что если в fullname вводится имя без пробела, то высветить ошибку, а не тупо запрещать такие конструкции на этапе кодинга.

C> http://www.wpi.edu/Pubs/ETD/Available/etd-042908-133033/unrestricted/cking.pdf

Да, вспоминаетя что-то такое. Статья 5-летней давности. А что-нибудь практическое у кого-нибудь получилось?
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Реактивное программирование с циклами
От: Cyberax Марс  
Дата: 22.09.13 05:02
Оценка:
Здравствуйте, ., Вы писали:

C>> Линзы, однако. Т.е. собирать формулы из линз, для которых обратимость гарантирована.

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

C>> http://www.wpi.edu/Pubs/ETD/Available/etd-042908-133033/unrestricted/cking.pdf

.>Да, вспоминаетя что-то такое. Статья 5-летней давности. А что-нибудь практическое у кого-нибудь получилось?
Backbone.js
Sapienti sat!
Re[4]: Реактивное программирование с циклами
От: . Великобритания  
Дата: 23.09.13 18:47
Оценка:
Здравствуйте, Cyberax, Вы писали:

C> Ну так линзами это прекрасно описывается, при неправильных входных данных для линзы просто по всему зависимому графу распространяется ошибочное состояние.

Осталось выразить в коде, надеюсь... В общем надо хорошенько прочитать статью.

C> .>Да, вспоминаетя что-то такое. Статья 5-летней давности. А что-нибудь практическое у кого-нибудь получилось?

C> Backbone.js
Так это обычная событийная модель, тысячи их, ничего из reactive programming:
    toggle: function() {
      this.save({done: !this.get("done")});
    }
    initialize: function() {
      this.listenTo(this.model, 'change', this.render);
    },
    render: function() {
      this.$el.toggleClass('done', this.model.get('done'));
      return this;
    },

или я не заметил какие-то прибамбасы?

Одна из фич которую хочется:

cell enabled
cell display = enabled ? slow_calculation(data) : ""

изменение data будет вызывать перерасчёт display только если enabled=true.
В событийной модели приходится писать динамическое подписывание|отписывание слушателей и бороться с утечками.
В том же python trellis как я понял это было реализовано...
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Реактивное программирование с циклами
От: Cyberax Марс  
Дата: 23.09.13 21:44
Оценка: 4 (1)
Здравствуйте, ., Вы писали:

C>> Ну так линзами это прекрасно описывается, при неправильных входных данных для линзы просто по всему зависимому графу распространяется ошибочное состояние.

.>Осталось выразить в коде, надеюсь... В общем надо хорошенько прочитать статью.
А, вспомнил. Ещё Elm есть: http://elm-lang.org/edit/examples/Intermediate/Physics.elm
Sapienti sat!
Re[4]: Реактивное программирование с циклами
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 25.09.13 08:49
Оценка:
Здравствуйте, Cyberax, Вы писали:

.>>Да, вспоминаетя что-то такое. Статья 5-летней давности. А что-нибудь практическое у кого-нибудь получилось?

C>Backbone.js

Скорее Bacon.js
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.