anchor.diff:                  
           [<StructuredFormatDisplay("{AsString}")>]
           type SynMethod(mi : MethodInfo, invoke : obj -> Scope -> obj) =
  +            let cache = mi.GetCustomAttributes<CacheSynthesizedAttribute>() |> Seq.isEmpty |> not
  +
               member x.MethodInfo = mi
               member x.Invoke = invoke
  -            
  +            member x.Cache = cache
  +
               member private x.AsString = 
                   x.ToString()
   
  
positive.code: 
  [<AttributeUsage(AttributeTargets.Struct ||| AttributeTargets.Class ||| AttributeTargets.Method)>]
  type RuleAttribute() =
      inherit Attribute()
  
  module Ag =
  
negative.code:         if isNull (node :> obj) then 
              None
          else
              let cacheName = "syn." + name
              scope.Enter()
              try
                  match scope.TryGetCacheValue cacheName with
                  | Some v ->
                      v
                  | None -> 
                      let t = node.GetType()
                      match table.Value.TryGetSynRule(name, t, expectedType)  with
                      | Some syn ->
                          if syn.Cache then
                              let newScope = scope.GetChildScope(node)
                              let result = syn.Invoke (node :> obj) newScope |> Some
                              scope.SetCacheValue(cacheName, result)
                              result
                          else
                              scope.Exit()
                              let newScope = scope.GetChildScope(node)
                              syn.Invoke (node :> obj) newScope |> Some
  
                      | _ ->
                          None
                  finally
                      scope.Exit()
  
     
      
      type System.Object with
  