commitbot (>), Brandon (>>): >> + has $!age is ref; # BUILD will automatically use ref binding, not copy > > Perl6 isn't done until it has reinvented Algol 68?
Unaware of what Algol 68 represents in programming language history, I perused Wikipedia's article on Algol 68: <http://en.wikipedia.org/wiki/ALGOL_68> (]): ] ALGOL 68 has been criticized, [...] for abandoning the simplicity of ] ALGOL 60 [and instead] becoming a vehicle for complex or overly ] general ideas, and doing little to make the compiler writer's task easy, ] [...] I wish I knew how to follow up that with something witty, but it would seem the quote more than speaks for itself. But instead of fruitlessly agreeing or disagreeing with a value judgement, let me try to summarize the discussion on-channel that led up to this particular spec change. When you initialize an Int attribute with an Int, you get that Int put inside the attribute container. $ perl6 -e 'class A { has Int $.foo }; say A.new(:foo(42)).foo'42 Similarly, when you initialize a Hash attribute with a Hash, you get that Hash put inside the attribute container. $ perl6 -e 'class A { has %.foo }; say A.new(:foo(bar => 42)).foo.perl' {"bar" => 42} $ perl6 -e 'class A { has %.foo }; say A.new(:foo{bar => 42}).foo.perl' {"bar" => 42} *However*, according to the way the old spec did things, and according to current Rakudo alpha and Rakudo master, when you initialize an Array attribute with an Array, you get that Array put inside *another* Array inside the attribute container. $ perl6 -e 'class A { has @.foo }; say A.new(:foo[1,2,3]).foo.perl' [[1, 2, 3]] (The reason for this has to do with attribute initialization having ordinary assignment semantics, meaning that internally it translates to something like `...@!foo = [1, 2, 3];`, which would indeed place the [1, 2, 3] array as the first element in @!foo rather than make that the whole array. Hashes don't suffer from this problem because `%!foo = { bar => 42};` does the right thing and assigns the hash to %!foo.) The discussion, starting at [1] and continuing at [2] and [3], mostly consisted of me repeating the same question until the above unintuitive quirk went away. It should now just create one layer of Array upon initialization. [1] http://irclog.perlgeek.de/perl6/2010-03-06#i_2070655 [2] http://irclog.perlgeek.de/perl6/2010-03-07#i_2073494 [3] http://irclog.perlgeek.de/perl6/2010-03-07#i_2073717 I'm not sure what exactly the repercussions of doing attribute initialization with 'is ref' are apart from that. Brandon, if your oblique reference to Algol 68 meant something more than what I uncovered above, feel free to enrich the discussion by sharing what you know about the possible consequences of spec'ing things this way. Now if you'll excuse me, I'll go back to doing little to make the compiler writers' task easy. :-P // Carl