Jay Kimble
2008-Mar-12 12:44 UTC
[Ironruby-core] Hosting... executing function dynamically from C#
Ok, I''m trying to do something interesting with the DLR (I emailed John before finding this forum... sorry, John). My project is here --> http://www.codeplex.com/dlrscript What I''m doing is hosting the DLR within a Silverlight 2.0 beta 1 app. My app scans the html dom for Script tags that target DLR languages effectively adding a new client scripting language to the browser. I''m embedding a couple objects as global vars into the script environment. One of these objects provides a mechanism for creating and event handler which is used in conjunction with my other object (document which provides getElementById). The app itself is written in C#, and my test page works perfectly for DLR Python (aka IronPython) and DLR JScript (AKA managed JavaScript). For DLR Ruby (AKA IronRuby), the globals are working, and the wiring up of the event works. The problem has to do with how I''m calling the Ruby function when the event fires (it fires a C# anonymous function which calls the Ruby function). The way I''m calling the function is via an instance of the Ruby ScriptEngine''s Execute function using a single statement (source kind)... the code looks something like this: // This is actually a function String method = "someFunction"; /// this is actually a param String codeID = "rby_command"; // this is also a param SourceCodeKind kind = SourceCodeKind.SingleStatement; // param // SourceCodeKind is actually a variable... first time through this is // "Statements" // This is the actual function beginning Exception result = null; ErrorSink sink = new ErrorSink(); try { CompilerOptions copts engine.GetDefaultCompilerOptions(); SourceUnit scu engine.CreateScriptSourceFromString(text, scriptid + "_" + this.shortName, kind); CompilerContext cc = new CompilerContext(scu, copts, sink); ICompiledCode icc = engine.Compile(scu, copts, sink); if (sink.AnyError) return new Exception("Syntax Error :" + sink.ToString()); if (scope == null) // This gets created the first iteration through { scope = engine.Runtime.CreateScope(); } engine.Execute(scope, scu); return null; } catch (Exception ex) { result = ex; } return result; I would expect that as long as I keep the same scope then the environment should be able to locate the local variable/function I''m trying to call. BTW, I''ve tried interactive, and expression, as well. None of them work. So what am I missing? My objects are definitely working. BTW, the code in the latest released project has changed. Ruby doesn''t work there (it is working perfectly except for this one item), so if I need to I will upload a zip of the project here. Also, thank you Michael of Michael.net... you''re logo DSL was very helpful for getting me this far with Ruby. Jay Kimble http://www.theruntime.com/blogs/jaykimble -- Posted via http://www.ruby-forum.com/.
Tomas Matousek
2008-Mar-12 17:44 UTC
[Ironruby-core] Hosting... executing function dynamically from C#
Could you simplify the example of what you''re trying to do? Do you want to execute: "def foo end" and then "foo" ? What is the source code ("text" variable)? Tomas -----Original Message----- From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Jay Kimble Sent: Wednesday, March 12, 2008 5:44 AM To: ironruby-core at rubyforge.org Subject: [Ironruby-core] Hosting... executing function dynamically from C# Ok, I''m trying to do something interesting with the DLR (I emailed John before finding this forum... sorry, John). My project is here --> http://www.codeplex.com/dlrscript What I''m doing is hosting the DLR within a Silverlight 2.0 beta 1 app. My app scans the html dom for Script tags that target DLR languages effectively adding a new client scripting language to the browser. I''m embedding a couple objects as global vars into the script environment. One of these objects provides a mechanism for creating and event handler which is used in conjunction with my other object (document which provides getElementById). The app itself is written in C#, and my test page works perfectly for DLR Python (aka IronPython) and DLR JScript (AKA managed JavaScript). For DLR Ruby (AKA IronRuby), the globals are working, and the wiring up of the event works. The problem has to do with how I''m calling the Ruby function when the event fires (it fires a C# anonymous function which calls the Ruby function). The way I''m calling the function is via an instance of the Ruby ScriptEngine''s Execute function using a single statement (source kind)... the code looks something like this: // This is actually a function String method = "someFunction"; /// this is actually a param String codeID = "rby_command"; // this is also a param SourceCodeKind kind = SourceCodeKind.SingleStatement; // param // SourceCodeKind is actually a variable... first time through this is // "Statements" // This is the actual function beginning Exception result = null; ErrorSink sink = new ErrorSink(); try { CompilerOptions copts engine.GetDefaultCompilerOptions(); SourceUnit scu engine.CreateScriptSourceFromString(text, scriptid + "_" + this.shortName, kind); CompilerContext cc = new CompilerContext(scu, copts, sink); ICompiledCode icc = engine.Compile(scu, copts, sink); if (sink.AnyError) return new Exception("Syntax Error :" + sink.ToString()); if (scope == null) // This gets created the first iteration through { scope = engine.Runtime.CreateScope(); } engine.Execute(scope, scu); return null; } catch (Exception ex) { result = ex; } return result; I would expect that as long as I keep the same scope then the environment should be able to locate the local variable/function I''m trying to call. BTW, I''ve tried interactive, and expression, as well. None of them work. So what am I missing? My objects are definitely working. BTW, the code in the latest released project has changed. Ruby doesn''t work there (it is working perfectly except for this one item), so if I need to I will upload a zip of the project here. Also, thank you Michael of Michael.net... you''re logo DSL was very helpful for getting me this far with Ruby. Jay Kimble http://www.theruntime.com/blogs/jaykimble -- Posted via http://www.ruby-forum.com/. _______________________________________________ Ironruby-core mailing list Ironruby-core at rubyforge.org http://rubyforge.org/mailman/listinfo/ironruby-core
Jay Kimble
2008-Mar-12 17:54 UTC
[Ironruby-core] Hosting... executing function dynamically from C#
Ack! I messed that up. Text is the script to run (I mislabelled it above as methodName)... here''s a little more detail: I have already executed a script that looks like this ------------------------- def myFunction() # do a bunch of stuff end #call code to wire up a button click pushing the function name ------------------------- When the button is clicked my anonymous C# code attempts to call the function passed in (in this case, it would be "myFunction" which would be the value of the Text variable in the function above). What comes back is an error saying that the variable can''t be found. -- Posted via http://www.ruby-forum.com/.
Jay Kimble
2008-Mar-13 13:23 UTC
[Ironruby-core] Hosting... executing function dynamically from C#
Alright I found the problem and it appears to be a problem between the chair and the keyboard... Sorry about that. I fat fingered my function name, and as soon as I discovered that it made sense that Iron Ruby was telling me that it couldn''t find that function (because it couldn''t). Jay -- Posted via http://www.ruby-forum.com/.