2016-01-09 9 views
9

In un'altra domanda (How can I declare and use a Perl 6 module in the same file as the program?), ho avuto il codice come questo:Come posso ispezionare un modulo Perl 6?

module Foo { 
    sub foo (Int:D $number) is export { 
     say "In Foo"; 
     } 
    } 

foo(137); 

ho voluto ispezionare il modulo di Foo per vedere se è definito e quello che potrebbe essere in esso per fare un po 'di debugging. Dato che Foo è un modulo e non una classe, i meta-metodi hanno senso?

Inoltre, ho pensato che esisteva un modo per ottenere un elenco di metodi in una classe. Mi piacerebbe avere una lista di subroutine in un modulo. Questo sarebbe un modo per testare che ho definito le cose giuste e Perl 6 ne sa. Nella mia roba Perl 5, ho spesso provato che ho definito una subroutine perché avevo un periodo in cui avrei scelto un nome nel modulo e un nome leggermente diverso nei test (come la scorsa notte, suppongo, con valid_value e is_value_value). Se potessi provare che è stato definito foo, potrei fare un po 'di debug qui.

risposta

8

È possibile ottenere la tabella dei simboli di un pacchetto aggiungendo un valore :: finale al suo nome. Questo funzionerà sia per i moduli che per le classi, ma nel caso in cui le classi non includano alcun metodo, come quelli associati all'oggetto type e non al pacchetto stesso.

La tabella dei simboli è di tipo Stash, che è associativa (cioè supporta operazioni di hash-like):

module Foo { 
    sub foo is export { ... } 
    sub bar is export(:bar) { ... } 
    our sub baz { ... } 
} 

# inspect the symbol table 
say Foo::.WHAT;  #=> (Stash) 
say Foo::.keys;  #=> (EXPORT &baz) 
say Foo::<&baz>.WHAT; #=> (Sub) 

# figure out what's being exported 
say Foo::EXPORT::.keys;   #=> (bar DEFAULT ALL) 
say Foo::EXPORT::bar::.keys;  #=> (&bar) 
say Foo::EXPORT::DEFAULT::.keys; #=> (&foo) 
say Foo::EXPORT::ALL::.keys;  #=> (&bar &foo)