On Thu, Feb 28, 2008 at 2:58 PM, Rick DeNatale <rick.denatale / gmail.com> wrote:
> On 2/28/08, Yukihiro Matsumoto <matz / ruby-lang.org> wrote:
>  >     on Fri, 29 Feb 2008 05:56:41 +0900, "Laurent Sansonetti" <laurent.sansonetti / gmail.com> 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
>
>  or
>
>     duck.dispatch("foo:bar:", 1, 2)
>

You can do that right now with MacRuby.

$ /usr/local/bin/irb --simple-prompt
>> d = NSMutableDictionary.new
=> #<NSCFDictionary:0x1641800>
>> k = NSString.new
=> #<NSCFString:0xa001b318>
>> d.send('setObject:forKey:', 'foo', k)
=> nil
>> d.objectForKey(k)
=> "foo"

(This is just an example.)

>  or any other acceptable name for dispatch, which is an objective-c
>  flavor of __send__.

You can also use NSObject#performSelector and its variants.

>> d.performSelector(:'objectForKey:', withObject:k)
=> "foo"

> Of course the problem with this is that MacRuby
>  is trying to build ruby on top of Objective-C mechanisms, rather than
>  the other way around.
>

MacRuby is only trying to make the better compromise between both
languages. We could use a completely new syntax which looks like
Objective-C, but Ruby developers won't like it, I think.

Laurent