Meinrad Recheis
2009-Feb-09 11:12 UTC
[Ironruby-core] setting global variables in embedded ironruby interpreter
Hello,
I am very pleased that I got everything working and found iron ruby in a
quite usable state for me. Congratulations.
Question: How do you set a global variable from C#? I found a workaround via
setting a local variable scope.SetVariable("a", obj) in the scope and
assigning it to a global via engine.Execute("$a=a", scope).
The Runtime.Globals.GetVariable and SetVariable don''t seem to get / set
the
ruby globals.
Please clarify.
BTW: as for local variables: scope.GetVariableNames() does return an empty
list. Again a workaround is Execute("local_variables", scope).
-- henon
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rubyforge.org/pipermail/ironruby-core/attachments/20090209/5169afaf/attachment.html>
Meinrad Recheis
2009-Feb-09 12:05 UTC
[Ironruby-core] setting global variables in embedded ironruby interpreter
On Mon, Feb 9, 2009 at 12:12 PM, Meinrad Recheis <meinrad.recheis at gmail.com>wrote:> Hello, > > I am very pleased that I got everything working and found iron ruby in a > quite usable state for me. Congratulations. > > Question: How do you set a global variable from C#? I found a workaround > via setting a local variable scope.SetVariable("a", obj) in the scope and > assigning it to a global via engine.Execute("$a=a", scope). > The Runtime.Globals.GetVariable and SetVariable don''t seem to get / set the > ruby globals. >Oh, i just found out that ScriptScope.GetVariable is throwing an exception ... ******************************************************************************** ArgumentNullException: "Value cannot be null. Parameter name: field" -------------------------------------------------------------------------------- Microsoft.Scripting.Utils.ContractUtils.RequiresNotNull(Object value, String paramName) Microsoft.Scripting.SymbolTable.StringToId(String field) Microsoft.Scripting.Hosting.ScriptScope.GetVariable(String name) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20090209/d0c0e418/attachment.html>
Meinrad Recheis
2009-Feb-09 12:11 UTC
[Ironruby-core] setting global variables in embedded ironruby interpreter
On Mon, Feb 9, 2009 at 1:05 PM, Meinrad Recheis <meinrad.recheis at gmail.com>wrote:> On Mon, Feb 9, 2009 at 12:12 PM, Meinrad Recheis < > meinrad.recheis at gmail.com> wrote: > >> Hello, >> >> I am very pleased that I got everything working and found iron ruby in a >> quite usable state for me. Congratulations. >> >> Question: How do you set a global variable from C#? I found a workaround >> via setting a local variable scope.SetVariable("a", obj) in the scope and >> assigning it to a global via engine.Execute("$a=a", scope). >> The Runtime.Globals.GetVariable and SetVariable don''t seem to get / set >> the ruby globals. >> > > Oh, i just found out that ScriptScope.GetVariable is throwing an exception > ... > > > ******************************************************************************** > ArgumentNullException: "Value cannot be null. > Parameter name: field" > > -------------------------------------------------------------------------------- > Microsoft.Scripting.Utils.ContractUtils.RequiresNotNull(Object value, > String paramName) > Microsoft.Scripting.SymbolTable.StringToId(String field) > Microsoft.Scripting.Hosting.ScriptScope.GetVariable(String name) >sorry forgot to say, that I made sure, that the "name" parameter is *not* null. I am not yet deep enough into the sources to fix things like these myself. -- henon -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20090209/f65fdeb5/attachment.html>
Meinrad Recheis
2009-Feb-09 12:32 UTC
[Ironruby-core] setting global variables in embedded ironruby interpreter
On Mon, Feb 9, 2009 at 1:11 PM, Meinrad Recheis <meinrad.recheis at gmail.com>wrote:> On Mon, Feb 9, 2009 at 1:05 PM, Meinrad Recheis <meinrad.recheis at gmail.com > > wrote: > >> On Mon, Feb 9, 2009 at 12:12 PM, Meinrad Recheis < >> meinrad.recheis at gmail.com> wrote: >> >>> Hello, >>> >>> I am very pleased that I got everything working and found iron ruby in a >>> quite usable state for me. Congratulations. >>> >>> Question: How do you set a global variable from C#? I found a workaround >>> via setting a local variable scope.SetVariable("a", obj) in the scope and >>> assigning it to a global via engine.Execute("$a=a", scope). >>> The Runtime.Globals.GetVariable and SetVariable don''t seem to get / set >>> the ruby globals. >>> >> >> Oh, i just found out that ScriptScope.GetVariable is throwing an exception >> ... >> >> >> ******************************************************************************** >> ArgumentNullException: "Value cannot be null. >> Parameter name: field" >> >> -------------------------------------------------------------------------------- >> Microsoft.Scripting.Utils.ContractUtils.RequiresNotNull(Object value, >> String paramName) >> Microsoft.Scripting.SymbolTable.StringToId(String field) >> Microsoft.Scripting.Hosting.ScriptScope.GetVariable(String name) >> > > sorry forgot to say, that I made sure, that the "name" parameter is *not* > null. > I am not yet deep enough into the sources to fix things like these myself. > > -- henonok, I was too fast on this one. actually it was null because a ruby_string casted to c# string is null. It is pretty dangerous to assume a value presented as "a" by the debugger to be a System.String when that value comes out from ruby ;) so the problem is not the exception but rather that GetVariable("a") does not find existing local variables which can be evaluated by Execute("a"). This time I made sure I made no mistake. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20090209/dd145a51/attachment.html>
Tomas Matousek
2009-Feb-09 17:28 UTC
[Ironruby-core] setting global variables in embedded ironruby interpreter
You can find many hosting examples in HostingTests.cs.
As for global and top-level local variables:
- Variables in ScriptRuntimeRuntime.Globals are mapped to global
constants (ie. constants on Object).
- Variables in local ScriptScope are not mapped to Ruby top-level local
variables. They are looked up via method_missing on a top-level singleton
object. Ruby top-level program executes in a context where "self" is a
singleton of Object. IronRuby defines method_missing on this singleton. If a
method name ends with "=" it writes to the scope, otherwise it reads
from the scope.
ScriptScope scope = Engine.CreateScope();
scope.SetVariable("x", 1);
scope.SetVariable("y", 2);
Engine.Execute("self.z = x + y", scope);
int result = scope.GetVariable<int>("result");
Assert(result == 3);
Ruby global variables don''t have any mapping to DLR scopes. We
don''t have any well designed API for them yet, you can do this for now:
Ruby.GetExecutionContext(Engine).DefineGlobalVariable("foo", 123);
Tomas
From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at
rubyforge.org] On Behalf Of Meinrad Recheis
Sent: Monday, February 09, 2009 3:13 AM
To: ironruby-core
Subject: [Ironruby-core] setting global variables in embedded ironruby
interpreter
Hello,
I am very pleased that I got everything working and found iron ruby in a quite
usable state for me. Congratulations.
Question: How do you set a global variable from C#? I found a workaround via
setting a local variable scope.SetVariable("a", obj) in the scope and
assigning it to a global via engine.Execute("$a=a", scope).
The Runtime.Globals.GetVariable and SetVariable don''t seem to get / set
the ruby globals.
Please clarify.
BTW: as for local variables: scope.GetVariableNames() does return an empty list.
Again a workaround is Execute("local_variables", scope).
-- henon
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rubyforge.org/pipermail/ironruby-core/attachments/20090209/97e814a6/attachment-0001.html>