Does 'temp' operate on the value or on the container?  

The text starts, "The temp macro temporarily replaces the value of an existing 
variable..." and the description seems consistent with that.

   temp $*foo = 'foo';

The restore feature is generated by calling VAR($*foo).TEMP, and the method 
Scalar.TEMP can call its own STORE method.

But then there is the example

   temp &bar := sub {...};

That is, it uses binding rather than assignment, which applies to the container 
itself.  

How can the container, which is Routine, know about the caller's &bar symbol?  
That is, &bar.TEMP, might be defined in Routine to be

   method TEMP ($self:)
    {
    ...
    return sub { $self := $originalvalue }
    }

it can rebind the $self argument which it closed over, but that will not affect 
the original caller's bar variable.  The aliasing of parameters to arguments is 
done by pointing to the same container.

Does anybody disagree with me?  That just doesn't compute.

Now what we really want here is to temporarily replace the meaning of the 
function call.  Routine already has the ability to be changed in-place, which 
is what .wrap does.  So we should simply allow .STORE to use the same ability, 
and then ordinary assignment, not binding, works.

   temp &bar = sub {...};  # use = not :=

The use of assignment calls the container's STORE, or whatever it will be named 
on Callable containers (there is no precedent in Perl 5's tie interface).  The 
use of temp will call Routine.TEMP for a closure, and it can work exactly like 
it does in a scalar: use its own STORE method to put back the saved value.

This change (just the one line of example) affects S06 under "Temporization".

--John

Reply via email to