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.")
    }
  ......


ЧЯДНТ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.