This is essentially how we implemented our rules script engine. It works 
really well.
 
-- 
Chuck Durfee
Lead Software Architect, CentreSuite
TSYS iSolutions, Golden
Email cdur...@tsys.com
 



Tomas Matousek <tomas.matou...@microsoft.com> 
Sent by: ironruby-core-boun...@rubyforge.org
11/06/2009 05:10 PM
Please respond to
ironruby-core@rubyforge.org


To
"ironruby-core@rubyforge.org" <ironruby-core@rubyforge.org>
cc

Subject
Re: [Ironruby-core] ironruby hosting as scripting engine






A better way of exposing application objects to the scripts and vice versa 
is to use ScriptScope:
 
var engine = IronRuby.CreateEngine();
var scope = engine.CreateScope();
scope.SetVariable(“my_app_object”, new App());
 
engine.Execute(@“
my_app_object.declare 'version 1'

def do_stuff
  'success'
end
”, scope);
 
var execute = scope.GetVariable<Func<string>>(“do_stuff”); 
Console.WriteLine(execute());
 
Top level Ruby methods defined in the executed script are published to the 
scope so that the host can read it via GetVariable method. Also, Ruby 
methods are convertible to delegates, so you can get the variable as 
Func<string> and call the delegate later.
 
Tomas
 
 
From: ironruby-core-boun...@rubyforge.org 
[mailto:ironruby-core-boun...@rubyforge.org] On Behalf Of Dotan N.
Sent: Friday, November 06, 2009 1:54 PM
To: ironruby-core@rubyforge.org
Subject: Re: [Ironruby-core] ironruby hosting as scripting engine
 
Kevin,
Yep i also needed to support input output but it all goes through the 
"$script" variable back to the backing C# object. for now, it makes it 
easier to have events and debugging. all in all the end result is that i 
provide an "API" exposed through $script.

Jimmy,
Thanks, I clearly overlooked that.

On Fri, Nov 6, 2009 at 11:16 PM, Jimmy Schementi <
jimmy.scheme...@microsoft.com> wrote:
Your solution sounds fine. To answer you first question though: 
engine.Execute("class Script; end") will always give you nil; classes 
return nil when defined:
 
>>> class Foo
... end
=> nil
 
You’ll have to do this to get the actual class object:
 
engine.Execute("class Script; end; Script")
 
~Jimmy
 
From: ironruby-core-boun...@rubyforge.org [mailto:
ironruby-core-boun...@rubyforge.org] On Behalf Of Dotan N.
Sent: Friday, November 06, 2009 11:17 AM
To: ironruby-core@rubyforge.org
Subject: [Ironruby-core] ironruby hosting as scripting engine
 
Hi guys sorry for the lengthy mail but i believe this is interesting since 
i've found a solution that someone else could use.

just had a session of trying to embed IR in my application.
I'm defining a user script which contains some initialization code and a 
special worker function 'execute'

this is the "user script":

script1.s --------------------------------------------------------
$script.declare "version 1"

def execute
   $script.report "success"
end
--------------------------------------------------------


what i'm doing is setting "script" as a global variable that is a gateway 
to my application.
I've tried this way first:

wrapping script1.s with "class Script <scriopt1.s content> end"
and doing Engine.Execute on it.

I expected to get a RubyObject as a result, which is the Script class.

then with the RubyObject i would do ObjectOperations.Invoke("execute"); 
when ever i wish.

I had 2 problems:

1. the RubyObject was always null. any idea why?
2. I couldn't really define a global variable properly (i've used the $a = 
a trick from the forum)



eventually i've realized this solution:
1. set global variable via RubyContext.DefineGlobalVariable
2.  i run everything on my script scope and Execute script1.s directly 
given a ScriptScope
3. do InvokeMember on the ScriptScope itself


from googling i've noticed the solution changed a lot along time.
so what is the proper way to do it? 


Thanks!


_______________________________________________
Ironruby-core mailing list
Ironruby-core@rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core
 _______________________________________________
Ironruby-core mailing list
Ironruby-core@rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core



-----------------------------------------
The information contained in this communication (including any
attachments hereto) is confidential and is intended solely for the
personal and confidential use of the individual or entity to whom
it is addressed. If the reader of this message is not the intended
recipient or an agent responsible for delivering it to the intended
recipient, you are hereby notified that you have received this
communication in error and that any review, dissemination, copying,
or unauthorized use of this information, or the taking of any
action in reliance on the contents of this information is strictly
prohibited. If you have received this communication in error,
please notify us immediately by e-mail, and delete the original
message. Thank you 
_______________________________________________
Ironruby-core mailing list
Ironruby-core@rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core

Reply via email to