В Perl 6, как мне сохранить модуль модуля в нижней части файла, все еще используя блоки объявлений для документирования метода / подпрограмм? - PullRequest
0 голосов
/ 23 декабря 2018

Допустим, у меня есть следующий модуль:

module Simple-Mod;

#| Calculate the nth fibonacci number.
multi fib( 0 ) { 1 }
multi fib( 1 ) { 1 }
multi fib( Int $n where * > 1 ) {
    fib($n - 2 ) + fib($n - 1);
}

#| Say hello to  a person.
sub hello( $person ) { say "Hello, $person!" }

=begin pod
=head1 SYNOPSIS

A really simple module.

=head1 Example
=begin code
use Simple-Mod;

say fib(3);    #=> 2
hello("Gina"); #=> Hello, Gina!

=end code

=head1 Subroutines

=end pod

В тот момент, когда я извлекаю Pod из этого модуля, я получаю это:

sub fib(
        Int $ where { ... }, 
)
Calculate the nth fibonacci number.

sub hello(
        $person, 
)
Say hello to a person.

SYNOPSIS

A really simple module.

Example

    use Simple-Mod;

    say fib(3);    #=> 2
    hello("Gina"); #=> Hello, Gina!

Subroutines

Возможно липоручить процессу синтаксического анализа Pod поместить определения и комментарии подпрограммы после заголовка Subroutines?Например:

SYNOPSIS

A really simple module.

Example

    use Simple-Mod;

    say fib(3);    #=> 2
    hello("Gina"); #=> Hello, Gina!

Subroutines

sub fib(
        Int $ where { ... }, 
)
Calculate the nth fibonacci number.

sub hello(
        $person, 
)
Say hello to a person.

Я мог бы поместить все, начиная с директивы =begin pod до =head1 Subroutines (за которой следует =end pod) вверху файла, а затем обычный код с блоками объявления.Однако я хотел бы сохранить все Pod в нижней части файла, если это возможно.

1 Ответ

0 голосов
/ 27 декабря 2018

Работая с модулем Pod::To::Text, я нашел несколько хакерское решение, которое далеко не надежно.Это зависит исключительно от новой подпрограммы и некоторых изменений в подпрограммах render, pod2text и heading2text:

unit class Pod::To::Textx;

my $top-pod = Any;
method render($pod, Bool $declarator-displacement = False) {
    $top-pod = $pod if $declarator-displacement;
    pod2text($pod)
}


sub pod2text($pod) is export {
     # other code

     when Pod::Block::Declarator { if $top-pod { succeed        } 
                                   else { declarator2text($pod) }
                                  }
     # remaining code
 }


sub add-code-info($pod) {
    return pod2text($pod.contents) unless $top-pod;

    if $pod.contents.head.contents.lc.contains("routines") {
        pod2text($pod.contents) ~ 
        @($top-pod).grep({ $_ ~~ Pod::Block::Declarator })
                   .map({ "\n\n" ~ declarator2text($_)  })
    }
}

sub heading2text($pod) {
    given $pod.level {
        when 1  {          add-code-info($pod)      }
        when 2  { '  '   ~ pod2text($pod.contents)  }
        default { '    ' ~ pod2text($pod.contents)  }
    }
 }

 # rest of code

Для рендеринга Pod в файле .p6 и размещения блоков декларатора под нимзаголовок уровня 1 под названием Subroutines/Routines, используйте:

 use Pod::To::Textx;

 say Text.new().render($=pod, True);

внутри файла.

...