Здравствуйте, 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);
}
}