Hi All,

I've been playing with the PythonEngine's CreateMethod<TDelegate>(..) and
declaring functions within the body of another function - however it doesn't
seem to work, for example I can writin a function like this:

def ExternalFunc():
        def InnerFunc1():
                def InnerFunc2():
                        return "2"
                return "1" + InnerFunc2()
        return "0" + InnerFunc1()

and then evaluate it...

>>> ExternalFunc()
'012'
>>>

But when I try to create a delegate for doing the same thing by shedding the
outer "layer" of the function, and creating it as a method via the
PythonEngine it doesn't work:

PythonEngine = new PythonEngine()
// some more setup code would go here...
Func<string> externalFunc = engine.CreateMethod<Func<string>>(@"def
InnerFunc1():
    def InnerFunc2():
        return ""2""
    return ""1"" + InnerFunc2()
return ""0"" + InnerFunc1()");

The call to CreateMethod spits the dummy, with a NullReferenceException...
here's the stack trace

failed: System.NullReferenceException : Object reference not set to an
instance of an object.
        at IronPython.Compiler.Generation.CodeGen.DefineDynamicMethod(String
name, Type retType, Type[] paramTypes)
        at IronPython.Compiler.Generation.CodeGen.DefineMethod(String name,
Type retType, Type[] paramTypes, SymbolId[] paramNames)
        at IronPython.Compiler.Ast.FunctionDefinition.Emit(CodeGen cg)
        at IronPython.Compiler.Ast.SuiteStatement.Emit(CodeGen cg)
        at
IronPython.Compiler.Ast.FunctionDefinition.EmitFunctionBody(CodeGen cg,
CodeGen ocg)
        at
IronPython.Compiler.Ast.FunctionDefinition.EmitFunctionImplementation(CodeGe
n methodCodeGen, CodeGen initCodeGen)
        at
IronPython.Hosting.PythonEngine.CreateDelegateWorker[TDelegate](Statement s,
IList`1 parameters)
        at
IronPython.Hosting.PythonEngine.CreateMethodUnscoped[TDelegate](String
statements, IList`1 parameters)
        at IronPython.Hosting.PythonEngine.CreateMethod[TDelegate](String
statements, IList`1 parameters, EngineModule engineModule)
        at IronPython.Hosting.PythonEngine.CreateMethod[TDelegate](String
statements)

Am I overlooking something in my code, or is this just a limitation of using
CreateMethod<TDelegate> to get a delegate to an anonymous python function?

For the mean time I'm just working around it by doing this:

engine.Execute(@"def ExternalFunc():
    def InnerFunc1():
        def InnerFunc2():
            return ""2""
        return ""1"" + InnerFunc2()
    return ""0"" + InnerFunc1()");
                        
PythonFunction func = _engine.EvaluateAs<PythonFunction>("ExternalFunc");

Func<string> funcDel = delegate { return (string)func.Call(); };

Which gets me a suitable delegate, but it's not really the same as I end up
having to declare the function as part of a module, which I was trying to
avoid... 

Chez,

 - Alex

_______________________________________________
users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to