From: Vidar Hokstad Date: 2006-09-13T08:10:35+09:00 Subject: Re: Newbie Question: - Parse my commands... paytonrules wrote: > The first step, which I'm doing now, is to take our executable program > and break the parsing engine into a DLL. That's easy. I can then > create a quick ruby program so I could do this: > > irb > load 'rubyProg' > > parse ObjectName.Make(param1, param2, param3, param4) > > > The rubyProg could work this way - but I'm pretty sure I can go one > step farther with ruby and just type: > > ObjectName.Make(param1, param2, param3, param4) > > through ruby extensions. The question is - how do I have the > interpreter pass on any code to the parser ruby can't handle it? method_missing() can be used for this to some extent. It depends on how exact you want the syntax. If you can get away with changing the object names so that they start with a lowercase letter it's cleaner. In Ruby, a capital first letter of a name indicates a constant, which means you need some extra uglyness to handle that. With a lowercase first letter in your object names you can do: class MissingProxy def initialize ob @ob = ob end def method_missing(sym,*args) # Call your script processor here. puts "PROCESS: #{@ob.to_s}.#{sym.to_s}(#{args.join(',')})" end end def method_missing(sym,*args) MissingProxy.new(sym) end myObject.Make('test',123) If, on the other hand you don't want to rewrite anything, you can wrap the statements like this: begin MyObject.Make('test',123) rescue NameError => n eval("#{n.name} = MissingProxy.new(:#{n.name})") retry end I'd consider both of these methods fairly ugly. They make trapping errors in your Ruby code tricky, as any misspelled object/class names will trigger your script interpreter instead of giving an error, but it does give a lot of flexibility. An alternative that is less intrusive is to wrap the latter method missing in a module: module Script def method_missing(sym,*args) MissingProxy.new(sym) end end And add the module name to any script command: Script.MyObject.Make('test',123) If you do it this way at least misspellings etc. in your Ruby code is less likely to trigger your script processing, but then I guess you could just as well do it the way you suggested in the first place. Vidar.