On Thu, Feb 28, 2008 at 6:33 AM, Rick DeNatale
<rick.denatale gmail.com> wrote:
>
> On 2/27/08, Laurent Sansonetti
<laurent.sansonetti gmail.com> wrote:
> > Hi,
> >
> > I am honored to announce the beginning of the
MacRuby project!
> >
> > MacRuby is a version of Ruby that runs on top of
Objective-C. More
> > precisely, MacRuby is currently a port of the
Ruby 1.9 implementation
> > for the Objective-C runtime and garbage
collector.
> >
> > You can learn more about the project on its
homepage:
> >
> > http://trac.macosforge.org/projects/ruby/wiki/MacRuby
> >
> > MacRuby is still extremely experimental, but a
first release is
> > expected very soon.
>
> Interesting stuff.
>
> After reading some of the material on the macosforge
wiki, I'm curious
> about the keyed arguments design.
>
> It sounds like if I invoke a method like this:
>
> x.foo(1, bar: 2)
>
> Then what happens is that this gets turned into an
> Objective-C/Smalltalk syntax message selector of
foo:bar:, but if I
> use
> x.foo(1, 2, bar: 3)
>
> then it effectively uses a different selector and uses
Ruby parameter
> semantics with bar: 3 getting mapped into {:bar =>
3} the way Ruby 1.9
> does it.
>
> So what happens if I write a ruby class like this:
>
> class C
> def foo(*a)
> keywords = a.pop if Hash === a.last
> ...
> end
> end
>
> And then, possibly in a separate file, write
>
> def quack(duck) # duck might be an instance of C, but
is it?
> duck.foo(1, 2, bar: 3) # I guess this would work
in any case.
True.
> 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.
> This also seems to be treading on some of the
territory which Matz has
> indicated he plans to be defining in Ruby 2.0. I'm
worried that
> there's a fork down the road here.
I don't really see this as a fork, but more as a port. Most
of MacRuby
is based on 1.9, because we want to use all the upstream
code base. We
just use Objective-C when it's necessary to provide a
tighter
integration with Mac OS X APIs. Because we want people to
use Ruby to
write complete full Mac OS X applications, without paying
the bridging
cost.
Laurent
|