Jonathan Scott Duff wrote: >> sub cond(Bool $c, $a, $b) is rw { >> if $c return $a else return $b; >> } >> >> Will this fail because $a and $b are not rw? If so, will it fail at run- >> or compile-time? What about this: >> > That looks like it should be a compile-time failure to me. >
Depends on the interpreter of course, but ideally, yes, compile time. >> sub cond(Bool $c, $a is copy, $b is copy) is rw { >> if $c return $a else return $b; >> } >> >> Is it allowed, and if so is the behaviour to return a writeable copy of >> $a or $b? I imagine that in any case >> > I'd expect a compile-time failure here too, or at the very least a > warning. Besides, returning a local copy each time hardly seems > useful, except perhaps as a way to leak memory. > It doesn't have to be a real copy, that's up to the implementation to apply whatever COW mechanism it likes. The type of $a and $b in this case is compatible with the return type of the function, so it should be fine. This example is a bit useless - cond($x, $a, $b) = $foo won't store the result anywhere. So this could be a warning along the lines of "useless use of variable in void context" (but more tailored to this condition) >> sub cond(Bool $c, $a is rw, $b is rw) is rw { >> if $c return $a else return $b; >> } >> >> will do what I want. >> > That is what I would expect too. > Right. >> my Int $a is constant = 0; >> my Int $b is constant = 0; >> (cond(True, $a,$b))++; >> > > We have a "constant" declarator now, so that would be > > constant Int $a = 0; > constant Int $b = 0; > (cond(True, $a,$b))++; > > and that should fail at compile time because the compiler knows that > $a and $b are constant and can't be rw. > Indeed it should, with the same disclaimer as above re: compile/runtime Sam.