Nie ma to nic wspólnego z opkodami, ale zawiera te same dwie zmienne w trzech różnych zamknięciach. Zmienne są zawarte w podprogramach przypominających klasowe procedury get/set, a te zamknięte warianty są następnie dzielone przez inne zamknięcia za pośrednictwem ich procedury dostępu.
To jest odpowiedź na komentarz: Jestem pewien, że będzie konieczne uzyskanie dostępu do podstawowych węzłów w drzewie analizy, aby móc utworzyć nowe zamknięcia, które są zamknięte na tych samych zmiennych.
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;
}
}
Z jednej strony fascynujące pytanie. Z drugiej strony brzmi jak coś do uruchomienia, a nie odejść. Jestem ciekaw, jaki jest twój przypadek użycia? –
Yous powiedzieć "i że drzewo parse można uzyskać z innego drzewa parse jakiegoś innego podprogramu.", Ale twoje pytanie nie ma absolutnie nic wspólnego z tym. Co właściwie próbujesz zrobić? – ikegami