Получение модуля модуля без явного его экспорта
Документация в программах на Perl 6, использующих Pod 6 DSL, фактически анализируется как часть кода; это делает эту документацию доступной внутри программы, так как $=pod
переменная. Однако мне бы хотелось иметь доступ к этой переменной, чтобы обработать ее, скажем, из тестов. В этом примере я написал для Perl 6 Advent Calendar, он просто экспортируется как переменная класса (в данном случае грамматика):
our $pod = $=pod[0];
Затем я могу использовать это так:
use Data::Dump;
use MONKEY-SEE-NO-EVAL;
sub MAIN( $module ) {
try require ::($module);
say Dump( $::($module)::pod, :max-recursion(2) );
}
Это работает, когда вызывается с именем класса и правильным путем; но он все еще нуждается в явном экспорте переменной.
Я видел в некотором коде, что хранилища precomp могут использоваться (извините, нет хорошего единственного источника, чтобы объяснить эти) для того же самого. В конце концов, эта строка
return nqp::atkey($handle.unit,'$=pod')[0];
Делает трюк, получая доступ к модулю модуля, который представлен магазином precomp и содержится в $handle.unit
, Дело в том, что это на самом деле более низкий уровень, используя nqp::atkey
оператор NQP, не совсем перл.
Есть много способов сделать это, поэтому я могу придумать два разных возможных вопроса.
1. Есть ли способ получить доступ через FQN (предшествует::) Pod этого require
д или use
д блок?
2. Есть ли у нас доступ к дескриптору precomp require
д или use
д блок, чтобы мы могли позвонить nqp::atkey
напрямую?
0 ответов
Я использовал эту технику (поиск более простых способов сделать это) для создания Module::Pod (скоро будет опубликован). См. Мой ответ: /questions/39318773/dostup-k-pod-iz-drugogo-fajla-perl-6/55254524#55254524