anchor.diff:  
           member x.Step() =
               x.EvaluateAlways null (fun () ->
  -                let (v, newSf) = current.run ctx input
  -                output v
  -
  -                let newDeps = newSf.dependencies |> HashSet
  -
  -                let added = newDeps |> Seq.filter (currentDeps.Contains >> not)
  -                let removed = currentDeps |> Seq.filter (newDeps.Contains >> not)
  -
  -                for r in removed do ctx.Unlisten r
  -                for a in added do ctx.Listen a
  -
  -                if ctx.IsEmpty then
  -                    evt.Reset()
  -
  -
  -                current <- newSf
  -                currentDeps <- newDeps
  +                let res = 
  +                    try current.run ctx input |> Some
  +                    with EndExn -> None
  +                    
  +                match res with
  +                    | Some(v, newSf) ->
  +                        output v
  +
  +                        let newDeps = newSf.dependencies |> HashSet
  +
  +                        let added = newDeps |> Seq.filter (currentDeps.Contains >> not)
  +                        let removed = currentDeps |> Seq.filter (newDeps.Contains >> not)
  +
  +                        for r in removed do ctx.Unlisten r
  +                        for a in added do ctx.Listen a
  +
  +                        if ctx.IsEmpty then
  +                            evt.Reset()
  +
  +
  +                        current <- newSf
  +                        currentDeps <- newDeps
  +                        true
  +                    | None ->
  +                        // todo: cleanup
  +                        false
               )
   
           override x.Mark() =
  
positive.code:     let buffers = Dict<Token, IBuffer>()
      let mutable containsTime = false
  
      member x.IsEmpty =
          not containsTime && lock buffers (fun () -> buffers.Values |> Seq.forall (fun b -> b.IsEmpty))
  
  
negative.code:             | (true, i) -> 
                  transact(fun () -> Mod.change step i)
              | _ -> 
                  if l.StartsWith "c" then transact (fun () -> Mod.change cancel true)
                  elif l.StartsWith "q" then finish <- true
                  else ()
  
      ()
  