我写了一个小的示例文件来了解有关Perl 6 POD的更多信息,我正在使用p6docPOD文档渲染一个小的手册页.但是,p6doc也尝试解析POD文档之外的声明器块.这在输出中看起来不是特别好.有没有办法在使用时忽略声明器块p6doc?
我正在使用的代码示例是:
#! /usr/bin/env perl6
use v6.c;
#| Greet people on the command line.
sub MAIN (
#| A name to greet.
$names,
#| Optional. Additional names to greet.
*@names,
) {
*
}
=begin pod
=NAME greeter
=AUTHOR Patrick Spek
=VERSION 0.0.1
The greeter application greets someone via a terminal. At least 1 name is
required, but multiple names can be given to greet many people in one go.
=end pod …Run Code Online (Sandbox Code Playgroud) 我开发了一个用于处理文档集合的模块。
该软件的一次运行会收集有关它们的信息。数据存储在称为%processed和 的两个结构中%symbols。需要缓存数据以供后续在同一组文档上运行软件,其中一些文档可能会发生变化。(文档本身是使用CompUnit 模块缓存的)。
目前数据结构的存储/恢复如下:
# storing
'processed.raku`.IO.spurt: %processed.raku;
'symbols.raku`.IO.spurt: %symbol.raku;
# restoring
my %processed = EVALFILE 'processed.raku';
my %symbols = EVALFILE 'symbols.raku';
Run Code Online (Sandbox Code Playgroud)
将这些结构输出到可能非常大的文件中可能会很慢,因为散列被解析以创建字符串化形式,并且因为它们正在重新编译而在输入时很慢。
它不用于检查缓存文件,仅用于保存软件运行之间的状态。
此外,虽然这对我的用例来说不是问题,但这种技术不能在一般情况下使用,因为字符串化(序列化)不适用于 Raku 闭包 - 据我所知。
我想知道是否可以使用 CompUnit 模块,因为它们用于存储模块的编译版本。那么也许,它们可以用来存储数据结构的“编译”或“内部”版本?
有没有办法做到这一点?
如果没有,是否有任何技术原因可能无法实现?
实际上,使用Pod 6 DSL的Perl 6程序中的文档被解析为代码的一部分;这使得该文档可以在程序内部作为$=pod变量使用。但是,我希望能够访问该变量,以便从例如测试中对其进行处理。在此示例中,我为Perl 6 Advent Calendar编写了该代码,只是将其导出为类(在这种情况下为语法)变量:
our $pod = $=pod[0];
Run Code Online (Sandbox Code Playgroud)
然后,我可以这样使用它:
use Data::Dump;
use MONKEY-SEE-NO-EVAL;
sub MAIN( $module ) {
try require ::($module);
say Dump( $::($module)::pod, :max-recursion(2) );
}
Run Code Online (Sandbox Code Playgroud)
当使用类的名称和正确的路径调用时,此方法有效。但是它仍然需要显式导出变量。
我在一些代码中看到可以将precomp存储用于同一件事(抱歉,没有很好的单一来源来解释这些内容)。最终,这条线
return nqp::atkey($handle.unit,'$=pod')[0];
Run Code Online (Sandbox Code Playgroud)
通过访问precomp存储所代表并包含在中的模块的Pod来达到目的$handle.unit。事实是,使用NQPnqp::atkey运算符,这实际上是较低的级别,而不是perl。
有很多方法可以做到这一点,所以我可以想到两个不同的可能问题。1.是否可以通过FQN(以::开头)访问required或used单元的Pod ?2.我们是否可以访问required或used单元的precomp句柄,以便我们可以nqp::atkey直接调用?
https://martimm.github.io/gnome-gtk3/content-docs/tutorial/Application/sceleton.html,缩写:
在 Raku 中,主程序保持小是很重要的。这是因为所有代码、程序和模块都被解析并编译成将由虚拟机执行的中间代码。大多数时候是 MoarVM,但也有一个 JVM,之后可能还有其他的。无论如何,在运行之前,已编译的模块会保存到 .precomp 目录中,但不会保存到程序中。这意味着程序总是在运行之前被解析和编译,这就是保持它小的原因。
Run Code Online (Sandbox Code Playgroud)use UserAppClass; my UserAppClass $user-app .= new; exit($user-app.run);好吧,你不能比这更小……,或者可以使用这种单衬;
exit(UserAppClass.new.run).其余代码在 UserAppClass 中定义。
非常好。
现在,我们的程序需要接受参数。sub MAIN解析参数并生成$*USAGE免费的,所以我们将利用sub MAIN.
我们将d by programsub MAIN放入used 中,但我们得到的程序不知道参数。并且在模块中时不执行。
我们把入程序,以便它理解论点,但它已经不小了。.raku.rakumod.rakusub MAINsub MAIN.raku
此外,嵌入POD的程序很可能会驻留在.raku程序中。
放入POD一个used by.raku程序.rakumod,我们得到了POD一些隐藏的东西。
将POD进入.raku程序并再次它已经不小了。
另外,这种方法是否有任何命名约定?
说,你有一个程序Report when your coffee is …
optimization program-entry-point command-line-arguments precompile raku
这与关于访问POD的这个问题有关,但它远不止于此.您可以使用以下命令轻松访问Perl 6程序的抽象语法树:
perl6 --target=ast -e '"Þor is mighty!".say'
Run Code Online (Sandbox Code Playgroud)
这将打印整个Q抽象语法树.如何从你自己的程序中做到这一点还不太清楚,或者我还没有找到如何做到这一点.实际上,该CoreHackers::Q模块将其作为外部脚本运行.但是能够从你自己的程序中访问它,比如
use QAST; # It does not exist
my $this-qast = QAST::Load("some-external-file.p6") # Would want something like this
Run Code Online (Sandbox Code Playgroud)
会很好.我很确定它应该是可能的,在NQP级别并且可能以Rakudo依赖的方式.有人知道热吗?
perl6 ×3
nqp ×2
raku ×2
caching ×1
optimization ×1
performance ×1
pod6 ×1
precompile ×1
precompiling ×1
rakudo ×1