2012-09-08 10 views
9

Biorąc ref kodzie, możliwe jest:Jak utworzyć sub-subl, określając jego drzewo składni?

  1. Dostęp drzewo parse z tym kodem ref
  2. Utwórz nowy kod ref określając drzewo składniowy o sygn kod, który może zawierać elementy parse drzewa zwrócone

Zwykle tworzenia podprogramów Perl określając kodu źródłowego, która jest następnie przetwarzane, na drzewie przetworzenia.

Chciałbym napisać funkcję Perla, która może utworzyć podprocedurę, określając jej drzewo analizy, a to drzewo analizy może pochodzić z innego drzewa parse innego podprogramu.

Możliwe?

+3

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? –

+2

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

Odpowiedz

7

Nie znam pełnej odpowiedzi na twoje pytanie, ale wiem, że Data :: Dumper może odrzucić odwołanie do kodu. Patrząc na jego dokumentację, widzę, że używa ona B::Deparse do podnoszenia ciężkiego (moduły B:: to te, które wchodzą w interakcję z kompilatorem). Niestety wygląda na to, że powoduje to jedynie tekstowe przedstawienie kodu coderef.

Zamiast tego szukałem Op na metacpan i dostałem o wiele więcej interesujących możliwości. Ponieważ jestem daleko poza moją głębią w najgłębszej magii Perla, zostawię ci to, abyś spojrzał na te wyniki. Być może coś będzie przydatne.

+0

Dzięki za prowadzenie "Op". Chcę pracować z zamknięciami, więc jestem pewien, że będzie trzeba uzyskać dostęp do podstawowych węzłów w drzewie analizy, aby móc tworzyć nowe zamknięcia, które są zamknięte na tych samych zmiennych. – ErikR

+3

Pamiętaj, aby sprawdzić również ['PadWalker'] (http://p3rl.org/PadWalker), myślę, że to jest to, czego wiele osób używa do badania zamknięć. –

1

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; 
    } 
} 
Powiązane problemy