Larry Wall larry-at-wall.org |Perl 6| wrote:
On Sat, Jun 13, 2009 at 02:49:10PM -0500, John M. Dlugosz wrote:
Wow. The overarching logic for list assignment would have to compare the containers and the arguments in the capture before doing the list assignment to each container, in order to avoid cloning all the containers on the right first in the general case. It can't just copy values out because they may contain iterators or be lazy or be infinite.


Well, that's not really a problem, as long as the same semantics
are preserved.  All you need to do is cut loose the contents of the
container completely to the mercy of GC, build a new one with the
appropriate structure, then copy values in from the assignment's RHS.
The only reason Perl 5 couldn't do it this way is that the idiot who
wrote it prematurely optimized values on the stack so that they didn't
need to be reference counted. :)

Larry

I agree, if "the contents" include the iterators and code blocks and whatnot that make up the concrete types of the things on the right. But if it's not a built-in standard type, it might require a call to the general shallow-copy clone of the object.

  my @A is CustomContainer;
  my @B[7];  # fixed size
  ...
  @B,@A,@C = @A,@B;

The compiler doesn't know how to juggle the internals of @A because it is not a standard type. This needs to become:

   my @temp1 = @A.clone;
   my @temp2 = @B.clone;
   @B,@A,@C = @temp1,@temp2;

and assume that the compiler might optimize the case with @B through innate knowledge, and possibly inline and optimize over the calls for @A.



Premature optimization is the root of all evil.

But... design the semantics so there is some hope of optimization. That might entail designing in some features of Positional that will be used by this construct, as more efficient than just calling .clone().

OTOH, machines are a million times faster than what Perl 4 originally ran on.

Reply via email to