On Mon, 04 Jun 2018 07:31:40 -0700, richard.hogab...@gmail.com wrote:
> Attached is an executable file that demos a possible Perl 6 OO bug if 
> attributes and method names are the same.  This includes some compile 
> time errors and an infinite loop.
> 

Thanks for the report, but there's no bug here.

The `has $.foo` attribute syntax is just a shorthand for writing `has $!foo; 
method foo { $!foo }`.
In other words, the compiler auto-generated an accessor method for you.

When you use `$.foo` syntax inside a method, it's a shorthand for `self.foo`; 
in other words, it's a
method call.

If you define a method with the same name as the attribute, then it signals to 
the compiler that you chose
to take care of accessor method yourself.

Also, to return a writeable container, you need to either use `return-rw` 
instead of plain `return` when
using explicit return, or apply the `is rw` trait to the method, when using 
implicit return:


    method var1() is rw { return    $!var }
    method var2()       { return-rw $!var }

With that knowledge, you can see why the failing examples fail:

* EXAMPLE 3: You defined a method with the same name as attribute, so it'll 
function as the accessor. The body
             of that method is empty, so it returns `Nil` and hence the error 
about trying to assign to `Nil`
* EXAMPLE 4: Again, you defined your own accessor, but now you're also using 
`$.var` syntax inside, so the method
             infiniloops calling itself over and over. Hence the hang.
* EXAMPLE 5: You've used `return` instead of `return-rw`, so only a readonly 
value is returned instead of a
             writable container. Hence the error

> but shouldn't there be some type of prohibition/warning?

No, as it's perfectly fine to declare your own accessors. Of course, writing 
`has $.foo` instead of `has $!foo` is
pointless, in that case, but it serves as a hint to the programmer that it's a 
public attribute, so I don't think
warning about that is appropriate.

Reply via email to