Esto no tiene nada que ver con los códigos de operación, pero encierra las mismas dos variables en tres cierres diferentes. Las variables están encerradas dentro de subrutinas que recuerdan las rutinas get/set de clase, y las variables cerradas son compartidas por otros cierres a través de su rutina de acceso.
Esta es una respuesta al comentario: Estoy seguro de que será necesario acceder a los nodos subyacentes en el árbol de análisis sintáctico para que pueda crear nuevos cierres que se cierran sobre las mismas variables.
use strict;
use warnings;
use v5.14;
# create closed vars
my $v1 = access_closure(6);
my $v2 = access_closure(42);
# play with them
say "v1 ", &$v1;
say "v2 ", &$v2;
say "v1 ", &$v1(5);
say "v2 ", &$v2(43);
say "v1 ", &$v1;
say "v2 ", &$v2;
# create silly closures that use them
my $test1 = test_closure(2);
my $test2 = test_closure(17);
my $test3 = test_closure(50);
# play with those
&$test1;
&$test2;
&$test3;
# create the get/set routine for a closed var
sub access_closure {
my $val = shift;
return sub {
$val = shift if @_;
return $val;
}
}
# create a silly closure that encloses a control var and uses the two other vars
sub test_closure {
my $val = shift;
return sub {
say "\nval is $val";
printf "v1 is %2d, v2 is %2d\n",
&$v1, &$v2;
if (&$v1 < $val) {
say "Increment v1";
&$v1(&$v1+1);
}
if (&$v2 > $val) {
say "Decrement v2";
&$v2(&$v2-1);
}
printf "v1 is %2d, v2 is %2d\n",
&$v1, &$v2;
}
}
Por un lado, una pregunta fascinante. Por otro lado, suena como algo para correr, no para alejarse. Tengo curiosidad por saber cuál es tu caso de uso –
Yous say "y ese árbol de análisis sintáctico podría derivarse de otro árbol de análisis de alguna otra subrutina.", Sin embargo, su pregunta no tiene absolutamente nada que ver con eso. ¿Qué está tratando de hacer realmente? – ikegami