Кеширование переменной
От: SSS135  
Дата: 08.12.11 15:16
Оценка:
Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции? Вот код того, во что по моему мнению должен разворачиваться этот макрос:

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: int
  private 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);
  }
}
cache
Re: Кеширование переменной
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 08.12.11 15:58
Оценка:
Здравствуйте, SSS135, Вы писали:

SSS>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?


Этот макрос называется Memoize.

https://github.com/rsdn/nemerle/blob/master/macros/Memoize.n
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Кеширование переменной
От: Lloyd Россия  
Дата: 08.12.11 16:16
Оценка:
Здравствуйте, Don Reba, Вы писали:

SSS>>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?


DR>Этот макрос называется Memoize.


По-моему, он имел в виду Reactive programming
Re[3]: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.12.11 19:07
Оценка:
Здравствуйте, Lloyd, Вы писали:

SSS>>>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?


DR>>Этот макрос называется Memoize.


L>По-моему, он имел в виду Reactive programming


Обоснуй, плиз.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.12.11 19:13
Оценка:
Здравствуйте, 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);
  }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Кеширование переменной
От: SSS135  
Дата: 09.12.11 04:56
Оценка:
Здравствуйте, Lloyd, Вы писали:

Lloyd>>По-моему, он имел в виду Reactive programming


Да, скорее всего мне оно и нужно.


Здравствуйте, VladD2, Вы писали:

VD>Такой макрос уже есть. Называется он Memoize. Применяется к методам.


VD>Единственная загвоздка — пересчет значений. Это в нем не сделано. Но это не трудно в него добавить. Можно добавить еще одну опцию задающую некий код при выполнении которого кэш будет сбрасываться. Тогда твой код будет выглядеть так:

VD>.........

Я попытался добавить свою опцию в этот макрос, но он отказывается её видеть:

.......
[Nemerle.MacroUsage (Nemerle.MacroPhase.WithTypedMembers, Nemerle.MacroTargets.Method)]
  macro Memoize (tb : TypeBuilder, meth : MethodBuilder, params opts : list [PExpr])
  {
    mutable scope = if(meth.IsStatic) MemoizeScope.Class else MemoizeScope.Instance;
    mutable synch = false;
    mutable invalidValue = None();
    mutable depends = None();

    foreach (o in opts)
    {
      | <[ Depends($what) ]> => depends = Some(what) // <- это он полностью игнорирует
      | <[ Scope = Instance ]> => scope = MemoizeScope.Instance
      | <[ Scope = Class    ]> => scope = MemoizeScope.Class
      | <[ Scope = $other ]> =>
        Message.Error (other.Location, $"Invalid parameter: Scope = $other. Valid options are Instance (default) and Class.")
      | <[ Synchronized = $(opt : bool) ]> => synch = opt
      | <[ Synchronized = $other ]> =>
        Message.Error (other.Location, $"Invalid parameter: Synchronized = $other. Valid options are true and false (default).")
      | <[ InvalidValue = $x ]> => invalidValue = Some(x)
      | x => // <- постоянно вываливается сюда
        Message.Error ($"Invalid parameter: $x. Valid parameters are Scope, Synchronized and InvalidValue.")
    }
  ......


ЧЯДНТ?
Re[3]: Кеширование переменной
От: hardcase Пират http://nemerle.org
Дата: 09.12.11 05:42
Оценка:
Здравствуйте, SSS135, Вы писали:

SSS>ЧЯДНТ?


Исполняется совсем не тот код который вы скомпилировали. Смотрите откуда грузятся сборки fuslogvw.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Кеширование переменной
От: Lloyd Россия  
Дата: 09.12.11 08:56
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>По-моему, он имел в виду Reactive programming


VD>Обоснуй, плиз.


Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.
Re[5]: Кеширование переменной
От: Аноним  
Дата: 09.12.11 10:21
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, VladD2, Вы писали:


L>>>По-моему, он имел в виду Reactive programming


VD>>Обоснуй, плиз.


L>Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.


А поддержка реактивного программирования макросами тут есть?
Re[6]: Кеширование переменной
От: Lloyd Россия  
Дата: 09.12.11 10:28
Оценка:
Здравствуйте, Аноним, Вы писали:

L>>Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.


А>А поддержка реактивного программирования макросами тут есть?


Об этом лучше спрашивать более осведомленных обитателей этого форума.
Re[3]: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.11 11:49
Оценка:
Здравствуйте, SSS135, Вы писали:

SSS>Я попытался добавить свою опцию в этот макрос, но он отказывается её видеть:...

SSS>ЧЯДНТ?

Код то верный. Вопрос только в том где он находится и как компилируется. Чтобы изменить стандартный макрос нужно пересобрать компилятор и интеграцию со студией. Это не простое дело.

Лучше создать у себя копию макроса. Дать ему другое имя или переместить в другое пространство имен. Далее для макроса нужно создать макро-проект и поместить в него макрос. Этот проект нужно подключить в солюшен в котором он будет использоваться и добавить на него ссылку (причем не макроссылку, а обычную, для отладки она лучше подходит).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.11 11:57
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Тут не нужны обоснования. Определение реактивного программирования один в одн совпадает с тем, что попросил топикстартер.


Да ладно? Реактивное программирование — это всего лишь кэш с возможностью его сбросить? А мужики то и не знали.

ЗЫ

Я конечно понимаю, что в жизни все зависит от взгляда на проблему, но где-то должны быть пределы.
Реактивное программирование — это программирование на событиях. Точнее на распространении изменений, но это слишком замысловато звучит. Здесь же вполне пассивная схема кэширования со сбросом.

Возможно, человеку и правда исходно была нужна событийная модель, но из приведенного примера этого не следует.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Кеширование переменной
От: Lloyd Россия  
Дата: 09.12.11 12:11
Оценка:
Здравствуйте, 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
}
Re[7]: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.11 13:36
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Я не вижу отличий между формулировкой топикстартера и формулировкой из википедии. Если ты считаешь, что отличия есть, ну что ж, значит мне не стоит прекращать заниматься английским.


Английский то тут причем? Мог бы и русской википедией воспользоваться.

L>

L>Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции?


А ты еще код глянь, а не по первым буквам суждения веди. Там отчетливо видно, что значение должно перерасчитываться при попытке его считывания. Да и на слово "кеширования" можно было бы внимание обратить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Кеширование переменной
От: Lloyd Россия  
Дата: 09.12.11 13:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А ты еще код глянь, а не по первым буквам суждения веди. Там отчетливо видно, что значение должно перерасчитываться при попытке его считывания. Да и на слово "кеширования" можно было бы внимание обратить.


Это не суть важно, как оно реализовано. Но убеждать тебя не буду, оставайся при своем мнении.
Re[3]: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.11 14:53
Оценка:
Здравствуйте, SSS135, Вы писали:

Lloyd>>>По-моему, он имел в виду Reactive programming

SSS>Да, скорее всего мне оно и нужно.

Если тебе нужно именно оно, то вместо полей у тебя должны быть свойства. И нужно менять реализацию этих свойств, чтобы при их изменении посылались события.

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

У тебя же в примере банальное отложенное вычисление и сброс кэша. До реактивной модели это не дотягивает. Хотя немного похоже.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.11 14:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А поддержка реактивного программирования макросами тут есть?


Только прототип реактивной системы для web-интерфейса. С натяжкой сюда же можно библиотеку для работы с конечными автоматами прибавить. С очень большой натяжкой.

Но никто не мешает создать нужные макросы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Кеширование переменной
От: WolfHound  
Дата: 09.12.11 19:09
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Да ладно? Реактивное программирование — это всего лишь кэш с возможностью его сбросить? А мужики то и не знали.

В данном случае Lloyd прав.
Это один из частных случаев.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Кеширование переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.11 22:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Да ладно? Реактивное программирование — это всего лишь кэш с возможностью его сбросить? А мужики то и не знали.

WH>В данном случае Lloyd прав.
WH>Это один из частных случаев.

Тогда любое ленивое вычисление тоже можно частным случаем признать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.