Получение модуля модуля без явного его экспорта - PullRequest
0 голосов
/ 05 декабря 2018

Документация в программах на Perl 6, использующих Pod 6 DSL, фактически анализируется как часть кода ;это делает эту документацию доступной внутри программы в виде переменной $=pod.Однако мне бы хотелось иметь доступ к этой переменной, чтобы обработать ее, скажем, из тестов.В этот пример, который я написал для календаря приключений Perl 6 , он просто экспортируется как переменная класса (в данном случае грамматика):

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) );

}

Работает при вызове с именем класса и правильным путем;но он все еще нуждается в явном экспорте переменной.

Я видел в некоторый код , который можно использовать в хранилищах предварительной компиляции (извините, нет хорошего единственного источника для объяснения этих) длято же самое.В конце концов, эта строка

 return nqp::atkey($handle.unit,'$=pod')[0];

добивается цели, получая доступ к модулю, который представлен магазином precomp и содержится в $handle.unit.Дело в том, что на самом деле это более низкий уровень, с использованием оператора nqp::atkey для NQP, не совсем perl .

Есть много способов сделать это, поэтомуЯ могу думать о двух разных возможных вопросах.1. Есть ли способ получить доступ через FQN (которому предшествует: :) Pod этого устройства require d или use d?2. Имеем ли мы доступ к дескриптору precomp блока require d или use d, чтобы мы могли напрямую вызывать nqp::atkey?

1 Ответ

0 голосов
/ 29 июля 2019

Я использовал эту технику (находя более простые способы сделать это), чтобы создать Module :: Pod (скоро будет опубликовано).Смотрите мой ответ: https://stackoverflow.com/a/57247392/332359

...