相关疑难解决方法(0)

不要使用p6doc显示声明符块

我写了一个小的示例文件来了解有关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)

documentation perl6

9
推荐指数
1
解决办法
125
查看次数

是否可以将 CompUnit 模块用于收集的数据?

我开发了一个用于处理文档集合的模块

该软件的一次运行会收集有关它们的信息。数据存储在称为%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 模块,因为它们用于存储模块的编译版本。那么也许,它们可以用来存储数据结构的“编译”或“内部”版本?

有没有办法做到这一点?

如果没有,是否有任何技术原因可能无法实现?

performance caching raku

9
推荐指数
1
解决办法
113
查看次数

在不显式导出的情况下获取模块的Pod

实际上,使用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直接调用?

perl6 precompiling nqp pod6

7
推荐指数
1
解决办法
94
查看次数

在不牺牲常规工作流程的情况下进行优化:参数、POD 等

https://martimm.github.io/gnome-gtk3/content-docs/tutorial/Application/sceleton.html,缩写:

在 Raku 中,主程序保持小是很重要的。这是因为所有代码、程序和模块都被解析并编译成将由虚拟机执行的中间代码。大多数时候是 MoarVM,但也有一个 JVM,之后可能还有其他的。无论如何,在运行之前,已编译的模块会保存到 .precomp 目录中,但不会保存到程序中。这意味着程序总是在运行之前被解析和编译,这就是保持它小的原因。

use UserAppClass;

my UserAppClass $user-app .= new;
exit($user-app.run);
Run Code Online (Sandbox Code Playgroud)

好吧,你不能比这更小……,或者可以使用这种单衬;exit(UserAppClass.new.run).

其余代码在 UserAppClass 中定义。

非常好。

  1. 现在,我们的程序需要接受参数。sub MAIN解析参数并生成$*USAGE免费的,所以我们将利用sub MAIN.
    我们将d by programsub MAIN放入used 中,但我们得到的程序不知道参数。并且在模块中时不执行。 我们把入程序,以便它理解论点,但它已经不小了。.raku.rakumod.rakusub MAIN
    sub MAIN.raku

  2. 此外,嵌入POD的程序很可能会驻留在.raku程序中。
    放入POD一个used by.raku程序.rakumod,我们得到了POD一些隐藏的东西。
    POD进入.raku程序并再次它已经不小了。

  3. 另外,这种方法是否有任何命名约定?
    说,你有一个程序Report when your coffee is …

optimization program-entry-point command-line-arguments precompile raku

6
推荐指数
1
解决办法
88
查看次数

从另一个程序获取Perl 6文件的QAST

这与关于访问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依赖的方式.有人知道热吗?

abstract-syntax-tree rakudo perl6 nqp

4
推荐指数
1
解决办法
111
查看次数