Кеширование переменной
От: 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.