小编Ric*_*rth的帖子

perl6正确地将例程传递给对象变量

我需要将一些代码从外部程序传递到一个类中.

在我使用的通用模块中(为简单起见,减少了愚蠢)

class A {
   has &.hl;
   submethod BUILD( :&!hl ) {}
}
Run Code Online (Sandbox Code Playgroud)

在程序的其他地方,我有

use A;
my &hl = -> $st { 
   my $p = shell "hl $st", :in,:out;
   $p.out.slurp
};
my $statement = 'my $perl6-variable = "Helloooo";'
my $first = &hl($statement);
my A $a .= new(:&hl);
my $second = $a.hl( $statement );
Run Code Online (Sandbox Code Playgroud)

$first 将被处理并将包含预期的结果.

$second,我将得到一个运行时错误

Too many positionals passed; expected 1 argument but got 2
Run Code Online (Sandbox Code Playgroud)

很明显,类中的例程正在提供调用者和参数$s.

重写类以提供自定义访问器:

class A {
   has &!hl;
   submethod BUILD( :&!hl …
Run Code Online (Sandbox Code Playgroud)

class perl6

7
推荐指数
3
解决办法
157
查看次数

使用 Cro run 重建更改的客户端文件

cro run当目录树中的任何内容发生更改时,停止服务器,重新编译,重新启动服务器。那太棒了。

但是在开发客户端 UI 并使用 NPX/yarn/webpack 时,需要一个额外的步骤来生成main.js文件。

在 Cro 教程中,这一步似乎是手动完成的,即,我们有一行“我们有了它。npm run build刷新,然后试一试”。npm run build是一个必须“手动”运行的命令。

有没有一种简单的方法,例如,.cro.yml在检测到子目录树中的更改时使用强制另一个命令?例如,如果客户端 UI 文件在下面,path/to/cro-app/client-ui-directory并且在任何文件更改时要运行的命令是path/to/cro-app/client-ui/directory/yarn build

cro raku

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

如何规范地解析模块名称

我有一个解析字符串的正则表达式,该字符串应该是 Raku 的完全限定模块名称(见下文)。由于 Precomp 模块中似乎只使用了 auth、ver 和 api 版本,因此我只测试了这些版本。

我需要将模块的名称与标识符分开。

我的正则表达式是:

my $rx := /
                       ^
                       $<name> = ( [ \w | '::' ] + )
                       [ ':' $<part> = ( [ 'ver' | 'auth' | 'api' ] )
                        \< ~ \> $<val> = ( .*? ) ]*
                       $
                      /;
Run Code Online (Sandbox Code Playgroud)

问题是是否有一种标准方法可以匹配 Raku 模块或子模块,以便此正则表达式将来不会成为错误。

regex module raku

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

如何在开发过程中设置 %?RESOURCES 键?

在我正在开发的模块config中,resources目录中将提供一个文件,因此可以%?RESOURCES<config>在我正在开发的代码中访问它。

在编写和测试代码时,我需要设置 %?RESOURCES。如何才能做到这一点?

在模块开始时,在开发阶段,我有use lib 'lib'.

我还没有安装 zef 模块,%?RESOURCESNil 也是如此。

META6.json 文件包含"resources": [ "config" ].

module raku

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

在CompUnit :: PrecompilationStore中更新程序?

我正在使用Rakudo Perl编译的文档,文档可以更新.
我将文档存储在CompUnit :: PrecompilationStore :: File中

如何为较新版本更改旧版本?

以下程序生成相同的输出,就好像较新版本未存储在CompUnit中一样.我究竟做错了什么?

use v6.c;
use nqp;
'cache'.IO.unlink if 'cache'.IO ~~ e;
my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');

'test.pod6'.IO.spurt(q:to/--END--/);
    =begin pod
    =TITLE More and more

    Some text

    =end pod
    --END--
$precomp.precompile('test.pod6'.IO, $key, :force);
my $handle = $precomp.load( $key )[0];
my $resurrected = nqp::atkey($handle.unit,'$=pod')[0];
say $resurrected.contents[1].contents[0];


'test.pod6'.IO.spurt(q:to/--END--/);
    =begin pod
    =TITLE More and more

    Some more text added

    =end pod
    --END--
# $precomp-store.unlock;
# fails with:
# Attempt …
Run Code Online (Sandbox Code Playgroud)

perl6

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

当线程太少时,程序挂起

运行以下程序时-t=17 -fn=15,程序会在合理的时间内停止.这意味着最大线程数大于写入和并发缓存的文件数.

按要求更新:$ perl6时的探查器输出 --profile con-test.p6 -t = 7 -fn = 5

当-t> = -fn时程序无法停止!

当程序运行-t=17 -fn=20 --hack程序时,然后在合理的时间内运行完成.

我不知道下面的程序是否失败,因为我在CompUnit中遇到问题,或者是否存在我遗漏的线程(或其他)问题.

假设存在某种线程情况并且文件数必须小于线程数,那么重写hack的最佳方法是什么.目前,数组中充满了Promises,然后允许保留.但等待要求在清空阵列并重新填充之前保留所有这些.我认为这应该被重写为渠道或供应.但是,我无法弄清楚如何做到这一点.

提前致谢.

use v6.c;
use nqp;
use File::Directory::Tree;

my Lock $lock;
my $precomp;
#assume a writable directory files/

sub MAIN(:$t=5, :$fn = 10, :$hack=False ) {
    PROCESS::<$SCHEDULER> = ThreadPoolScheduler.new(initial_threads => 0, max_threads => $t);

    rmtree '.test';
    empty-directory 'files';

    my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix => '.test'.IO );
    $precomp = CompUnit::PrecompilationRepository::Default.new(store => $precomp-store);
    $lock .=new;
    my %files = |gather …
Run Code Online (Sandbox Code Playgroud)

concurrency perl6

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

日志类参考

存根Routes.pm6的第13行创建的新实例 Cro::HTTP::Log::File

在哪里可以找到该课程的文档?例如,是否要将日志和错误发送到同一文件?

我尝试对:logs使用字符串,但出现错误。该类需要文件句柄。我在寻找一些文档,但是那里是否存在并不明显。

cro raku

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

Raku - 程序如何验证模块是否安装在本地

我如何发现本地是否安装了 Raku 模块?如果未安装某些模块,例如。GUI,然后将使用 CLI。例如。

if is-installed('GTK::Simple') { gui-response } else { cli-response };
Run Code Online (Sandbox Code Playgroud)

'is-installed'的主体应该是什么?

installation module raku

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

如何间接访问类的属性

这与我的另一个问题类似,但又不完全相同:内容检查部分而非全部类属性

我正在编写一个测试来验证处理对对象的影响。但是我无法弄清楚如何获取一组已知对象属性的值,但使用相同的代码进行测试。类似于以下内容(不起作用):

class A { has $.a, has $.b, has $.c };
my A $v .=new(:1a, :2b);

for <a b> { ok $v.{$_} > 0 }; # this does not work, but illustrates the intent.
Run Code Online (Sandbox Code Playgroud)

如果我使用 Hash 而不是对象,那么很容易从知道键的 Hash 中获取值。

目前我能想到的就是测试每个属性:

ok $v.a > 0;
ok $v.b > 0;
Run Code Online (Sandbox Code Playgroud)

另外,我不想查看对象的所有属性,这是 .^attributes 给我的,只查看其中的一些。

attributes class raku

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

如何从调用框架访问 $_ 变量?

在 Raku 中,我想替换$_<something>\xc6\xa4<something>where $_does Associative

\n

假设我有类似的东西

\n
my %h = %( aaa => { say $_<content> } );\n%h<aaa>.( %( :content('Hello world'), ) );\n
Run Code Online (Sandbox Code Playgroud)\n

这会产生Hello world.

\n

由于$_会出现很多次,我想将其替换为\xc6\xa4(不仅仅是为了保存一个字符,而是为了检查存在性等)。

\n

所以我想要的是:

\n
my %h = %( aaa => { say \xc6\xa4<content> } );\n%h<aaa>.( %( :content('Hello world  '), ) );\n
Run Code Online (Sandbox Code Playgroud)\n

我可以编写一个前缀运算符但是,我需要访问调用上下文的主题变量,即“aaa”指向的块内部sub prefix:<\xc6\xa4>(Str $key)的值。$_

\n

这是我尝试过的代码:

\n
sub prefix:<\xc6\xa4>(Str $key) {\n    my $topic = callframe(1).my<$_>;\n      # …
Run Code Online (Sandbox Code Playgroud)

raku

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

内省捕获的更好方法

我想测试签名中第一个对象的类型。下面显示了我发现的一些方法。但是为什么对 Type(下面 3 个测试中的第 2 个)的智能匹配不起作用?有没有比字符串化和测试 Type 的字符串等价物更好的方法?(以下是我正在研究的用例)

raku -e "sub a( |c ) { say so |c[0].WHAT.raku ~~ /'Rat'/, so |c[0].WHAT ~~ Rat, so |c[0].^name ~~ /'Rat'/ };a(3/2);a(2)"
TrueFalseTrue
FalseFalseFalse
# OUTPUT:
#TrueFalseTrue
#FalseFalseFalse
Run Code Online (Sandbox Code Playgroud)

我正在写一个proto sub handle,大多数潜艇都有类似的签名,例如。multi sub handle( Pod $node, MyObj $p, Int $level --> Str)

所以大多数多子节点根据 $node 中的内容做不同的事情。但是,如何处理handle使用Nil或纯字符串调用的情况。我正在考虑类似的事情

proto handle(|c) {
    if |c[0].^name ~~ /'Str'/ { # code for string }
    else { {*} }
}
Run Code Online (Sandbox Code Playgroud)

introspection raku

5
推荐指数
2
解决办法
129
查看次数

如何从 RakuAST 中提取数据

config从a 的部分中提取哈希值如何最好RakuAST::Doc::Block?这是程序:

use v6.d;
use experimental :rakuast;

my $ast = Q:to/CONF/.AST;
=for rakudoc :category("Language") :kind<sub> :subkind<operator>
Stuff
CONF
my $block = $ast.rakudoc[0];
my %config = $block.config.pairs.map( { .key  =>  .value.DEPARSE } );
say %config.raku
Run Code Online (Sandbox Code Playgroud)

这是结果。

{:category("(\"Language\")"), :kind("<sub>"), :subkind("<operator>")}

Run Code Online (Sandbox Code Playgroud)

.DEPARSE正在生成引号,即("...")<...>。我怎样才能提取字符串?

raku

5
推荐指数
1
解决办法
137
查看次数