anchor.diff:      let register_value (name, value) =
           JSEngine.registerValue(JSUtils.context, name, value)
       List.iter register_value l
  +
  +
  +type Signature =
  +    Sign of (System.Type[] * System.Type[])
  +
  +let create_signature (e:Expr) =
  +    let gmi, args =
  +        match e with
  +            | DerivedPatterns.Lambdas(_,Patterns.Call(_,mi,args)) -> mi.GetGenericMethodDefinition(), args
  +            | _ -> failwith "!"
  +    let arg_types = gmi.GetParameters() |> Array.map (fun (el:ParameterInfo) -> el.ParameterType)
  +    let ret_types = gmi.ReturnType
  +    if FSharpType.IsTuple(ret_types) then
  +        (Sign(arg_types, FSharpType.GetTupleElements(gmi.ReturnType)))
  +    else (Sign(arg_types, [|ret_types|]))
  
positive.code:     project_hack (typeof<'T>) x |> unbox<'T>
  
  and embed_func (x:obj) =
      let f = fun (arg: JSValue[]) ->
          let domain = FSharpType.GetFunctionElements (x.GetType()) |> fst
          let projected_args =
              if FSharpType.IsTuple domain then
                  let proj_args_array = Array.map2 project_reflection (FSharpType.GetTupleElements domain) arg
                  [| FSharpValue.MakeTuple(proj_args_array, domain) |]
  
negative.code:         with
              | exn -> JSEngine.throwException(JSUtils.context, embed exn)
  
      JSEngine.makeFunction(JSUtils.context, new JSEngine.FSharpFunction(f))
  
  and project_func ty (f:JSValue list -> JSValue) : obj =
      let range = FSharpType.GetFunctionElements ty |> snd
  