Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции? Вот код того, во что по моему мнению должен разворачиваться этот макрос:
using System;
using System.Console;
class Test
{
// неплохо было бы заменить кучу строк ниже на одну:
// public cached(valCompute) Val: int depends dep1, dep2
// или
// public cached(valCompute, dep1, dep2) Val: int
// или
// [Cached(valCompute, dep1, dep2)]
// public Val: intprivate mutable _CacheMacro_Cached_Val: int;
private mutable _CacheMacro_IsCached_Val: bool = false;
private mutable _CacheMacro_dep1_Val: int;
private mutable _CacheMacro_dep2_Val: int;
public Val: int
{
get
{
if(_CacheMacro_IsCached_Val && _CacheMacro_dep1_Val == dep1 && _CacheMacro_dep2_Val == dep2)
_CacheMacro_Cached_Val
else
{
_CacheMacro_Cached_Val = valCompute();
_CacheMacro_dep1_Val = dep1;
_CacheMacro_dep2_Val = dep2;
_CacheMacro_Cached_Val
}
}
}
private valCompute(): int
{
dep1 + dep2
}
public mutable dep1: int = 0;
public mutable dep2: int = 0;
}
// пример использованияmodule Program
{
Main() : void
{
def test = Test();
WriteLine(test.Val);
test.dep1 = 5;
WriteLine(test.Val);
test.dep2 = 5;
WriteLine(test.Val);
}
}
Здравствуйте, SSS135, Вы писали:
SSS>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?
Здравствуйте, Don Reba, Вы писали:
SSS>>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?
DR>Этот макрос называется Memoize.
Здравствуйте, Lloyd, Вы писали:
SSS>>>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?
DR>>Этот макрос называется Memoize.
L>По-моему, он имел в виду Reactive programming
Обоснуй, плиз.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, SSS135, Вы писали:
SSS>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?
Такой макрос уже есть. Называется он Memoize. Применяется к методам.
Единственная загвоздка — пересчет значений. Это в нем не сделано. Но это не трудно в него добавить. Можно добавить еще одну опцию задающую некий код при выполнении которого кэш будет сбрасываться. Тогда твой код будет выглядеть так:
using System;
using System.Console;
class Test
{
public Val: int
{
[Memoize(ResetWhenMemberChanged(dep1, dep2))]
get
{
valCompute();
}
}
private valCompute(): int
{
dep1 + dep2
}
public mutable dep1: int = 0;
public mutable dep2: int = 0;
}
// пример использованияmodule Program
{
Main() : void
{
def test = Test();
WriteLine(test.Val);
test.dep1 = 5;
WriteLine(test.Val);
test.dep2 = 5;
WriteLine(test.Val);
}
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Lloyd, Вы писали:
Lloyd>>По-моему, он имел в виду Reactive programming
Да, скорее всего мне оно и нужно.
Здравствуйте, VladD2, Вы писали:
VD>Такой макрос уже есть. Называется он Memoize. Применяется к методам.
VD>Единственная загвоздка — пересчет значений. Это в нем не сделано. Но это не трудно в него добавить. Можно добавить еще одну опцию задающую некий код при выполнении которого кэш будет сбрасываться. Тогда твой код будет выглядеть так: VD>.........
Я попытался добавить свою опцию в этот макрос, но он отказывается её видеть:
Здравствуйте, VladD2, Вы писали:
L>>По-моему, он имел в виду Reactive programming
VD>Обоснуй, плиз.
Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.
Re[5]: Кеширование переменной
От:
Аноним
Дата:
09.12.11 10:21
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, VladD2, Вы писали:
L>>>По-моему, он имел в виду Reactive programming
VD>>Обоснуй, плиз.
L>Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.
А поддержка реактивного программирования макросами тут есть?
Здравствуйте, Аноним, Вы писали:
L>>Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.
А>А поддержка реактивного программирования макросами тут есть?
Об этом лучше спрашивать более осведомленных обитателей этого форума.
Здравствуйте, SSS135, Вы писали:
SSS>Я попытался добавить свою опцию в этот макрос, но он отказывается её видеть:... SSS>ЧЯДНТ?
Код то верный. Вопрос только в том где он находится и как компилируется. Чтобы изменить стандартный макрос нужно пересобрать компилятор и интеграцию со студией. Это не простое дело.
Лучше создать у себя копию макроса. Дать ему другое имя или переместить в другое пространство имен. Далее для макроса нужно создать макро-проект и поместить в него макрос. Этот проект нужно подключить в солюшен в котором он будет использоваться и добавить на него ссылку (причем не макроссылку, а обычную, для отладки она лучше подходит).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Lloyd, Вы писали:
L>Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.
Да ладно? Реактивное программирование — это всего лишь кэш с возможностью его сбросить? А мужики то и не знали.
ЗЫ
Я конечно понимаю, что в жизни все зависит от взгляда на проблему, но где-то должны быть пределы.
Реактивное программирование — это программирование на событиях. Точнее на распространении изменений, но это слишком замысловато звучит. Здесь же вполне пассивная схема кэширования со сбросом.
Возможно, человеку и правда исходно была нужна событийная модель, но из приведенного примера этого не следует.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
L>>Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.
VD>Да ладно? Реактивное программирование — это всего лишь кэш с возможностью его сбросить? А мужики то и не знали.
Я не вижу отличий между формулировкой топикстартера и формулировкой из википедии. Если ты считаешь, что отличия есть, ну что ж, значит мне не стоит прекращать заниматься английским.
Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?
For example, in an imperative programming setting, a: = b + c would mean that a is being assigned the result of b + c in the instant the expression is evaluated. Later, the values of b and c can be changed with no effect on the value of a.
In reactive programming, the value of a would be automatically updated based on the new values.
Re[7]: Кеширование переменной
От:
Аноним
Дата:
09.12.11 12:39
Оценка:
//react, groupreact - ключевые словаmutable x=1;
mutable y=2;
mutable z=3;
react in(x,y,z) out(x,y,z) {(x,y,z)=(z,x,y);}
x=5; // тут сразу вызывается react
groupreact
{
x=1;
x=2;
// тут происходит вызов react
}
Здравствуйте, Lloyd, Вы писали:
L>Я не вижу отличий между формулировкой топикстартера и формулировкой из википедии. Если ты считаешь, что отличия есть, ну что ж, значит мне не стоит прекращать заниматься английским.
Английский то тут причем? Мог бы и русской википедией воспользоваться.
L>
L>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?
А ты еще код глянь, а не по первым буквам суждения веди. Там отчетливо видно, что значение должно перерасчитываться при попытке его считывания. Да и на слово "кеширования" можно было бы внимание обратить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>А ты еще код глянь, а не по первым буквам суждения веди. Там отчетливо видно, что значение должно перерасчитываться при попытке его считывания. Да и на слово "кеширования" можно было бы внимание обратить.
Это не суть важно, как оно реализовано. Но убеждать тебя не буду, оставайся при своем мнении.
Здравствуйте, SSS135, Вы писали:
Lloyd>>>По-моему, он имел в виду Reactive programming SSS>Да, скорее всего мне оно и нужно.
Если тебе нужно именно оно, то вместо полей у тебя должны быть свойства. И нужно менять реализацию этих свойств, чтобы при их изменении посылались события.
Главная фишка реактивной модели заключается в том, как выглядят вычисления. В ней GUI или еще что-то цепляется на события и автоматически обновляется при изменении нижележащих данных.
У тебя же в примере банальное отложенное вычисление и сброс кэша. До реактивной модели это не дотягивает. Хотя немного похоже.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Аноним, Вы писали:
А>А поддержка реактивного программирования макросами тут есть?
Только прототип реактивной системы для web-интерфейса. С натяжкой сюда же можно библиотеку для работы с конечными автоматами прибавить. С очень большой натяжкой.
Но никто не мешает создать нужные макросы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Да ладно? Реактивное программирование — это всего лишь кэш с возможностью его сбросить? А мужики то и не знали.
В данном случае Lloyd прав.
Это один из частных случаев.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
VD>>Да ладно? Реактивное программирование — это всего лишь кэш с возможностью его сбросить? А мужики то и не знали. WH>В данном случае Lloyd прав. WH>Это один из частных случаев.
Тогда любое ленивое вычисление тоже можно частным случаем признать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.