Hi Rakoth, On Aug 19, 2008, at 7:21 AM, Rakoth Lichlord wrote:
While writing portions of mac programs in Ruby and mixing it with Objective-C is cool, but it's not all that MacRuby could do.
I'm attempting to write an application which would contain scriptable parts, utilizing MacRuby (Lua has been used for this purpose for a long time, but MacRuby with access to ObjC classes is a much more powerful tool for the job!).
Thanks :)
So far I've run into these issues, any help appreciated:
- Need to execute MacRuby code from any source (parse a string) Solution 1: "rb_eval_string" - does not cut it because of a bug (#109 in trac) - it seems MacRuby forgets variables created by previous calls to rb_eval_string, maybe there's more to it then that Solution 2: [RBKernel eval:@"..."] - This example has been mentioned in this mailist but I've found no references to RBKernel or anything similar in the MacRuby.framework. Guess it was more of a proposal.
I would like to introduce an Objective-C API in MacRuby core to permit this kind of things from a pure Objective-C environment. Basically initializing the VM, evaluating expressions, but also creating blocks, etc... Right now, one thing you can do is to mimic what macruby_main() does, to initialize the VM. Then, in theory, rb_eval_string() should just work. You could also try to call Kernel#eval directly: (gdb) po [rb_mKernel eval:@"1+1"] 2 Here rb_mKernel is a static variable that points to the Kernel module, but you can also retrieve it dynamically. (gdb) po [objc_getClass("Kernel") eval:@"1+1"] 2
- Need to be able to clean up (full reset) of the MacRuby VM - release all defined objects, undefine classes. Is this even possible? How costly would it be, time-wise?
I don't think this is possible, right now. But we can work on this. At a glance, the only problematic thing would be to remove C extensions that were loaded. Laurent