Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Константин Б., Вы писали:
C>>>От Rx отличие в том, что нет никакой завязки в коде на него. КБ>>Ну и на шарпе это выглядело бы как-нибудь так: C>Не пройдёт. Во-первых, тебе надо будет всё помещать в один большой контекст.
Нет не надо.
C>Во-вторых: C>
C>var a = 10;
C>var b = 20;
C>//Указываем как мы рассчитываем текст на поле ввода
C>form.displayField.text = function() {
C> return a+b; //Обычный код, может включать вызовы других функций и т.п.
C>}
C>form.displayField2.text = function() {
C> return b^2;
C>}
C>a=11; //Пересчитается первое поле
C>b=12; //Пересчитаются оба поля
C>
И где такое чудо? O_o В треллисе и нокаут-жсе будут пересчитаны оба.
А такое оно тоже разрулит?
var a = 10;
var b = 20;
var c = 30;
//Указываем как мы рассчитываем текст на поле ввода
form.displayField.text = function() {
if a < 20:
return b;
else:
return c;
}
form.displayField2.text = function() {
if a < 20:
return c;
else:
return b;
}
b=12; //Пересчитаются только первое поле?
с=12; //Пересчитается только второе поле?
Здравствуйте, Константин Б., Вы писали:
КБ>И где такое чудо? O_o В треллисе и нокаут-жсе будут пересчитаны оба.
Поспорим? В Треллисе будет пересчитано только то, что зависит от изменяемой переменной.
КБ>А такое оно тоже разрулит? КБ>
КБ>var a = 10;
КБ>var b = 20;
КБ>var c = 30;
КБ>//Указываем как мы рассчитываем текст на поле ввода
КБ>form.displayField.text = function() {
КБ> if a < 20:
КБ> return b;
КБ> else:
КБ> return c;
КБ>}
КБ>form.displayField2.text = function() {
КБ> if a < 20:
КБ> return c;
КБ> else:
КБ> return b;
КБ>}
КБ>b=12; //Пересчитаются только первое поле?
КБ>с=12; //Пересчитается только второе поле?
КБ>
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Константин Б., Вы писали:
КБ>>И где такое чудо? O_o В треллисе и нокаут-жсе будут пересчитаны оба. C>Поспорим? В Треллисе будет пересчитано только то, что зависит от изменяемой переменной.
Здравствуйте, Cyberax, Вы писали:
C>>> Он решает немного другие задачи, по сравнению с Trellis для Питона или http://knockoutjs.com/ для JS. НС>>Ну так раскрой мысль, что такого не хватает статически типизированным языкам. C>Нельзя, к примеру, динамически поменять функциональность методов
Это не задача
C>, чтобы отслеживать любое обращение к данным внутри наблюдаемого множества
Здравствуйте, Ночной Смотрящий, Вы писали:
C>>Нельзя, к примеру, динамически поменять функциональность методов НС>Это не задача
Это иногда бывает нужно при решении задач.
C>>, чтобы отслеживать любое обращение к данным внутри наблюдаемого множества НС>Зачем его отслеживать? http://rsdn.ru/forum/flame.comp/4347619.aspx
Здравствуйте, Cyberax, Вы писали:
C>>>Нельзя, к примеру, динамически поменять функциональность методов НС>>Это не задача C>Это иногда бывает нужно при решении задач.
Передавать обёртку аля Binding<T> (имя можно подсократить)? Если хочется абсолютно идентичного поведения — придётся повозиться с разбором expression tree, да и производительность (без emit-а) будет близка к яваскрипту.
Если чуть упростить задачу — достаточно
public Binding GetBinding(Func<Binding[], Binding> selector, params Binding[] sources)
{
}
Или, если не стоит задача "сделать один в один" — списываем систему биндингов с WPF.
Здравствуйте, Sinix, Вы писали:
S>Передавать обёртку аля Binding<T> (имя можно подсократить)? Если хочется абсолютно идентичного поведения — придётся повозиться с разбором expression tree, да и производительность (без emit-а) будет близка к яваскрипту.
Можно на динамиках сделать. Не теряя, где это возможно, статики.
S>Или, если не стоит задача "сделать один в один" — списываем систему биндингов с WPF.
+1. Только в испольнении шарпа там все печально. Нужна или доработка языка или метапрограмминг.
Здравствуйте, Константин Б., Вы писали:
КБ>>>И где такое чудо? O_o В треллисе и нокаут-жсе будут пересчитаны оба. C>>Поспорим? В Треллисе будет пересчитано только то, что зависит от изменяемой переменной. КБ>Давай
No problemo:
#!/usr/bin/python
from peak.events import trellis
def very_complex_function(a, b):
return (a+b)/2
class TestContext(trellis.Component):
trellis.attrs(a = 0, b = 5, c=10)
@trellis.perform
def show_values(self):
if (self.a>20):
print "A is greater than 20: %d" % very_complex_function(self.b,self.c)
else:
print "A is less than 20, so: %d" % self.b
tc = TestContext()
print "Now mutating self.c ..."
tc.c = 11 # Ничего не персчитается, мы не зависим от self.c сейчас
print "mutated."
print "Now mutating self.b ..."
tc.b = 12 # А вот от self.b мы зависим - пересчитается
print "mutated."
print "Now mutating self.a ..."
tc.a = 21 # Теперь зависим от b и c.
print "mutated."
print "Now mutating self.c ..."
tc.c = 5 # Так что СЕЙЧАС оно пересчитается
print "mutated."
Вывод:
A is less than 20, so: 5
Now mutating self.c ...
mutated.
Now mutating self.b ...
A is less than 20, so: 12
mutated.
Now mutating self.a ...
A is greater than 20: 11
mutated.
Now mutating self.c ...
A is greater than 20: 8
mutated.
— как такой пример на статике красиво сделать? S>Передавать обёртку аля Binding<T> (имя можно подсократить)? Если хочется абсолютно идентичного поведения — придётся повозиться с разбором expression tree, да и производительность (без emit-а) будет близка к яваскрипту.
Не получится. Точнее, придётся делать разбор произвольных функций и их интерпретацию. По сути, сделать динамику собственными руками.
C>Не получится. Точнее, придётся делать разбор произвольных функций и их интерпретацию. По сути, сделать динамику собственными руками.
Необязательно, достаточно передавать список переменных, за обновлениями которых нужно следить.
Впрочем, разбор не вызовет особых проблем, если передавать ExpressionTree<Func<T>>.
Здравствуйте, Sinix, Вы писали:
C>>Не получится. Точнее, придётся делать разбор произвольных функций и их интерпретацию. По сути, сделать динамику собственными руками. S>Необязательно, достаточно передавать список переменных, за обновлениями которых нужно следить.
Посмотри пример с Trellis'ом — этот список может динамически меняться.
Здравствуйте, Klapaucius, Вы писали:
C>>как такой пример на статике красиво сделать? K>А как такой пример красиво сделать на динамике? http://rsdn.ru/forum/flame.comp/4348289.aspx
Здравствуйте, Cyberax, Вы писали:
C>Посмотри пример с Trellis'ом — этот список может динамически меняться.
Тогда да, только разбор. Ну, или какой-нить AOP.
K>И где тут красота?
Везде Как такое сделать-то на статике? Вопрос не совсем праздный, так как я собираюсь делать подобный фреймворк для Скалы.
К примеру, оно ещё и двустороннее. Т.е. мы можем взять два поля ввода, скажем, градусы в Цельсиях и градусы в Фаренгейтах — и при изменении одного поля пересчитывается другое.
Здравствуйте, Cyberax, Вы писали: C>Здравствуйте, Константин Б., Вы писали: КБ>>>>И где такое чудо? O_o В треллисе и нокаут-жсе будут пересчитаны оба. C>>>Поспорим? В Треллисе будет пересчитано только то, что зависит от изменяемой переменной. КБ>>Давай C>No problemo:
Скрытый текст
C>
C>#!/usr/bin/python
C>from peak.events import trellis
C>def very_complex_function(a, b):
C> return (a+b)/2
C>class TestContext(trellis.Component):
C> trellis.attrs(a = 0, b = 5, c=10)
C> @trellis.perform
C> def show_values(self):
C> if (self.a>20):
C> print "A is greater than 20: %d" % very_complex_function(self.b,self.c)
C> else:
C> print "A is less than 20, so: %d" % self.b
C>tc = TestContext()
C>print "Now mutating self.c ..."
C>tc.c = 11 # Ничего не персчитается, мы не зависим от self.c сейчас
C>print "mutated."
C>print "Now mutating self.b ..."
C>tc.b = 12 # А вот от self.b мы зависим - пересчитается
C>print "mutated."
C>print "Now mutating self.a ..."
C>tc.a = 21 # Теперь зависим от b и c.
C>print "mutated."
C>print "Now mutating self.c ..."
C>tc.c = 5 # Так что СЕЙЧАС оно пересчитается
C>print "mutated."
C>
C>Вывод: C>
C>A is less than 20, so: 5
C>Now mutating self.c ...
C>mutated.
C>Now mutating self.b ...
C>A is less than 20, so: 12
C>mutated.
C>Now mutating self.a ...
C>A is greater than 20: 11
C>mutated.
C>Now mutating self.c ...
C>A is greater than 20: 8
C>mutated.
C>
Здравствуйте, Константин Б., Вы писали:
КБ>Понял в чем жульничество %) При каждом вычислении он запоминает к каким атрибутам было обращение. На шарпе можно сделать точно так же.
Ну да. На Шарпе такое сделать не очень просто — нужно статически заранее делать инструментацию всех классов. В JS с этим проще — все объекты можно в рантайме заменять на прокиски.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Константин Б., Вы писали:
КБ>>Понял в чем жульничество %) При каждом вычислении он запоминает к каким атрибутам было обращение. На шарпе можно сделать точно так же. C>Ну да. На Шарпе такое сделать не очень просто — нужно статически заранее делать инструментацию всех классов. В JS с этим проще — все объекты можно в рантайме заменять на прокиски.
Ну БлТулкит же как-то умудряется генерировать проксики в рантайме.