Forum: IronRuby setting global variables in embedded ironruby interpreter

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
48d1aca7191f2d16e184971054c7c143?d=identicon&s=25 Meinrad Recheis (Guest)
on 2009-02-09 12:38
(Received via mailing list)
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
48d1aca7191f2d16e184971054c7c143?d=identicon&s=25 Meinrad Recheis (Guest)
on 2009-02-09 13:24
(Received via mailing list)
On Mon, Feb 9, 2009 at 12:12 PM, Meinrad Recheis
<meinrad.recheis@gmail.com>wrote:

>
Oh, i just found out that ScriptScope.GetVariable is throwing an
exception
...

********************************************************************************
ArgumentNullException: "Value cannot be null.
Parameter name: field"
48d1aca7191f2d16e184971054c7c143?d=identicon&s=25 Meinrad Recheis (Guest)
on 2009-02-09 15:42
(Received via mailing list)
On Mon, Feb 9, 2009 at 1:05 PM, Meinrad Recheis
<meinrad.recheis@gmail.com>wrote:

>> assigning it to a global via engine.Execute("$a=a", scope).
> 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
48d1aca7191f2d16e184971054c7c143?d=identicon&s=25 Meinrad Recheis (Guest)
on 2009-02-09 15:54
(Received via mailing list)
On Mon, Feb 9, 2009 at 1:11 PM, Meinrad Recheis
<meinrad.recheis@gmail.com>wrote:

>>>
>>
>
> 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


ok, 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.
Cb51033949ffccd982ae32c9f890f25a?d=identicon&s=25 Tomas Matousek (Guest)
on 2009-02-09 19:09
(Received via mailing list)
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@rubyforge.org
[mailto:ironruby-core-bounces@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
This topic is locked and can not be replied to.