public static bool AddFunction <A0, A1, A2, A3, R>(this CFlat self, string functionName, System.Func <A0, A1, A2, A3, R> function)
            where A0 : struct, IMarshalable
            where A1 : struct, IMarshalable
            where A2 : struct, IMarshalable
            where A3 : struct, IMarshalable
            where R : struct, IMarshalable
        {
            var builder = new FunctionTypeBuilder(self.chunk);

            builder.WithParam(Marshal.TypeOf <A0>(self.chunk));
            builder.WithParam(Marshal.TypeOf <A1>(self.chunk));
            builder.WithParam(Marshal.TypeOf <A2>(self.chunk));
            builder.WithParam(Marshal.TypeOf <A3>(self.chunk));
            builder.returnType = Marshal.TypeOf <R>(self.chunk);
            return(FinishAddFunction(self, builder, functionName, (vm, top) =>
            {
                var functionInterface = new FunctionInterface(vm, top);
                FunctionInterface.Return(vm, function(
                                             functionInterface.Arg <A0>(),
                                             functionInterface.Arg <A1>(),
                                             functionInterface.Arg <A2>(),
                                             functionInterface.Arg <A3>()
                                             ));
            }));
        }
        public static bool AddFunction <R>(this CFlat self, string functionName, System.Func <R> function)
            where R : struct, IMarshalable
        {
            var builder = new FunctionTypeBuilder(self.chunk);

            builder.returnType = Marshal.TypeOf <R>(self.chunk);
            return(FinishAddFunction(self, builder, functionName, (vm, top) =>
            {
                FunctionInterface.Return(vm, function());
            }));
        }