anchor.diff:          if isNull (node :> obj) then 
               None
           else
  -            let t = node.GetType()
  -            match table.Value.TryGetSynRule(name, t, expectedType)  with
  -            | Some syn ->
  -                let newScope = scope.GetChildScope(node)
  -                syn.Invoke (node :> obj) newScope |> Some
  -            | _ ->
  -                None
  +            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
  
positive.code:                     None
              | _ ->
                  None
  
  
          member internal x.TryGetInheritedCache(name : string) : option<option<obj>> =
              lock inherited (fun () ->
  
negative.code:                 
          [<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()
  
  