Как заставить поведение модуля сохраняться в переменной типа `$ = pod`? - PullRequest
7 голосов
/ 13 мая 2019

Можно ли преобразовать код pod, который сохраняется в переменной, таким образом, что он ведет себя как $=pod при использовании с pod2text?

#!/usr/bin/env perl6
use v6;
use Pod::To::Text;

my $code = $*PROGRAM.slurp;
my $pod = $code.subst( / ^ .+ \n <?before '=begin pod'> /, '' );

# convert $pod so it works with pod2text like $=pod does

say pod2text $pod;
say "==============";
say pod2text $=pod;

=begin pod

=head1 NAME

Test pod

=head1 DESCRIPTION

This is a test.

=end pod

Ответы [ 2 ]

6 голосов
/ 13 мая 2019

Переменная $=pod содержит Array значений, каждое из которых является экземпляром (подклассом) Pod::Block.Поэтому вам нужно воспроизвести это.

Предоставление компилятору Rakudo всей работы

Если вы компилируете некоторый код P6 с помощью компилятора P6, то любой Pod в нем должен автоматически компилироваться, ипеременная $=pod автоматически инициализируется, чтобы содержать результаты компиляции Pod.Использование Rakudo:

=begin foo
foo-text
=end foo

say $=pod;

отображает:

[Pod::Block::Named{:name("foo")}
  Pod::Block::Para
    foo-text
]

Просматривая соответствующие модули компилятора ( грамматика , действия , составление оболочки ) Я подозреваю, что потребовалось бы немало усилий, чтобы понять это.Возможно, что плодом этого понимания станет возможность использовать часть этого кода как есть, но я подозреваю, что, по крайней мере, в равной степени вероятно, что вы не сможете без рефакторинга кода компилятора до некоторой степени.

Работа с

Следующее $pod также будет принято pod2text:

my $pod =
  [Pod::Block::Named.new:
     :name("foo"),
     :contents[Pod::Block::Para.new:
       :contents["foo-text"]]];

say $pod; # displays same result as for `$=pod` above

Решение?

Предположительно, решение, которое вы ищете, находится где-то между этими крайностями,

3 голосов
/ 13 мая 2019

Вы можете использовать Pod::Load:

Это ваша программа:

use v6;
use Pod::To::Text;

=begin pod

=head1 NAME

Test pod

=head1 DESCRIPTION

This is a test.

=end pod

И вот где вы ее загружаете:

use Pod::Load;

use Pod::To::Text;

my $pod = load( "get-pod.p6" );
dd $pod;

say pod2text $pod;

Сам Perl6 анализирует Pod вместе с остальной частью программы, поэтому ответ @raiph также действителен, и, в этом отношении, $ = pod, который вы использовали в своей программе.

...