Можно ли написать макрос для кеширования значения функции в переменной и пересчет этого значения при изменении переменных, от которых зависит значение функции? Вот код того, во что по моему мнению должен разворачиваться этот макрос:
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);
}
}