From: Laurent Sansonetti Date: 2008-02-29T10:46:42+09:00 Subject: Re: [ANN] MacRuby On Thu, Feb 28, 2008 at 4:44 PM, Evan Phoenix wrote: > > On Feb 28, 2008, at 3:04 PM, Laurent Sansonetti wrote: > > > On Thu, Feb 28, 2008 at 1:51 PM, Yukihiro Matsumoto > > wrote: > >> Hi, > >> > >> In message "Re: [ANN] MacRuby" > >> > >> on Fri, 29 Feb 2008 05:56:41 +0900, "Laurent Sansonetti" >> > writes: > >> > >> |> duck.foo(1, bar: 2) # mapped to foo:bar: what does an > >> |> instance of C do with this? > >> | > >> |Here, MacRuby will check if duck responds to foo:bar:. If true, this > >> |message is sent with 1 and 2 as arguments. If not true, the foo > >> |message is sent instead with 1 and {:bar => 2} as arguments. > >> | > >> |If you're working with pure Ruby objects, the second code path > >> should > >> |always be taken. Unless you define foo:bar: in your Ruby class. > >> | > >> |Note that the key:value syntax to describe a hash pair is > >> available in > >> |vanilla 1.9. > >> > >> I still think having dedicated syntax for Objective-C call is better > >> than overriding normal call. > >> > >> > >> duck.foo: 1 bar: 2 > >> > >> or > >> > >> > >> duck.foo: 1, bar: 2 > >> > >> maybe? I am not sure if the parser allows this or not yet. > >> > > > > I thought about working up for Objective-C calling support via this > syntax: > > O[duck :foo => 1, :bar => 2] > > At one point, I had a small parser change that allowed this to be > written as: > > O[duck foo: 1, bar: 2] > > The idea was that the rubinius compiler would detect this special form > and emit the 'right thing'. > Your idea is surprising, but how would you do to override an Objective-C method? > I think a bit part of this is whether you expect users (and other > code) to know they're calling out to Objective-C, or if you want tight > integration. This is essential what matz says. > Yes I do agree with that. > By making special Objective-C syntax, then you can't pass in an > Objective-C object and expect it to be duck-typed like normal ruby > objects. But the trade off is that the syntax is less elegant. I think > it's a trade off, and my 2 cents is you should opt for the more > elegant syntax. This is because there are only a few tiny edge cases > where the Objective-C selector matches the ruby selector, where you'd > want to allow the ObjC object to be duck typed as something else. > [...] > > Something else that has not been brought up (that I saw) is whether > ruby methods are available as Objective-C methods. Can ruby methods be > called directly via the ObjC runtime? > In MacRuby, Ruby methods are in fact Objective-C methods, by default. Everything is registered to the Objective-C runtime. Calling them from Objective-C might be tricky sometimes, because Ruby allows some characters in method names that Objective-C doesn't. But using the runtime API (ex. objc_msgSend) should just work. My point is, there should not be any special syntax to call Objective-C methods because all methods are Objective-C methods. Or at least, no extremely special syntax. I do like the current implemented one, as many people so far. duck.foo 1, bar:2 A few people also like Matz's first suggestion, which is to specify the ':' in the first part of the method call, because it's more consistent with the selector that will be sent. duck.foo:1, bar:2 But so far, most of these people are Objective-C developers and not Ruby developers. Laurent