'xx' 运算符的有趣之处在于:
(^100).pick xx 10
Run Code Online (Sandbox Code Playgroud)
生成 10 个随机 Int 的列表,而不是一个随机 Int 作为列表重复 10 次。
编译器是否将运算符作为特殊情况处理?或者它真的只是另一个我们也可以定义自己的潜艇?(如果是这样,我很想知道如何......)
谢谢
我的模块依赖的Fcntl模块(https://github.com/manchicken/perl6-Fcntl),很久没有更新了,坏了。但是,如果我手动操作,有一个 fork ( https://github.com/jonathanstowe/perl6-Fcntl ) 对我zef install有用。是否可以在我的模块中指定依赖项,META-6.json以便正确的 github repo 将用于安装模块?
我正在尝试像这样重载 >> 运算符:
class A {}
multi sub infix:«>>»(A:D $a, Str() $b) is assoc<non> { dd $a; dd $b }
my $x = A.new;
$x >> 'output.txt';
Run Code Online (Sandbox Code Playgroud)
但是我在第 5 行收到一个编译错误,内容是:
Unsupported use of >> to do right shift. In Raku please use: +> or ~>.
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
不久前,我编写了一个Raku 模块来测试我对制作外部流程管道(例如,grep raku | wc -l)的一些想法。我遵循了为外部进程创建Pipes和设置I/O重定向的传统方式。
由于forkin 中没有可用Raku,也没有由于线程中的线程而被推荐MoarVM,因此我求助于使用Proc::Async为管道中的每个外部命令启动包装器进程,然后包装器将设置I/O重定向以连接命令进程和管道,并且然后在exec-ing 真正的命令之前关闭其他 FD 。
这一切似乎都运行良好,除了使用该模块的程序的其他部分仍有可能在管道创建之后但在关闭之前在另一个线程中启动子进程(例如,通过run、shell、Proc、 或Proc::Async)FDs,从而导致泄漏它们并导致管道中的命令进程阻塞read / write。
您将如何防止FDs泄漏到在另一个线程中启动的任何子进程Raku?
谢谢
在我的程序中,我想从$*IN循环中读取一行,为此我可以使用get或prompt; 但是,我注意到如果我立即用 EOF 结束我的输入(例如,在 Linux/MacOS 中用 Ctrl-D),那么任何后续使用get或prompt读取另一行 from$*IN都会导致它返回Nil,这意味着它仍然从$*IN.
例子:
dd get;
dd get;
Run Code Online (Sandbox Code Playgroud)
使用立即 EOF (ctrl-d),程序结束并输出 2 Nil。
如果输入的内容不仅仅是 EOF,则不会发生此问题。
奇怪的是,这个问题也不会发生在slurp. IE,
dd slurp;
dd slurp;
Run Code Online (Sandbox Code Playgroud)
在第一个 ctrl-d 之后,""由第一个打印dd,然后由于第二个而等待输入slurp。
我认为这也是他们同样的问题 - https://github.com/rakudo/rakudo/issues/4196
我有一个perl6程序,该程序通过运行外部程序Proc::Async并尝试读取它stdout。可能应该以某种方式读取标准输出的代码部分可能无法执行此操作,但是程序的其他部分实际上将终止外部进程以进行清理。然而,这样的杀戮过程,再经过等待的承诺,它会阻止永远...,我怎么能避免perl6阻塞在等待杀死Proc::Async,其stdout通过管道输送,但不消耗?我认为以下代码段说明了该问题:
#!/usr/bin/env perl6
#
my $proc = Proc::Async.new(<cat /dev/urandom>);
my $supply = $proc.stdout(:bin);
my $promise = $proc.start;
$proc.ready.then: {
shell <<ps auxf | grep [u]random>>;
put "Terminating process {$_.result} …";
$proc.kill(SIGTERM);
}
sleep 1;
if shell(<<ps auxf | grep [u]random>>).exitcode ? 0 {
put "processed killed!";
}
put "awaiting $proc ({$proc.command}) …";
await $promise; # <--- blocked here :(
Run Code Online (Sandbox Code Playgroud) 我正在使用vim-perl6进行语法高亮,但我想调整变量sigils的颜色,以便它们不那么出众.也许,让他们看起来苍白或什么.我怎么做?谢谢.
我希望能够查看和更改已安装(通过zefPerl6模块)的源代码。我怎样才能做到这一点?
在我的系统上,模块源位于下面,~/.perl6/sources/并且中也有关于模块的某种元数据文件~/.perl6/dist/。
我也可以zef locate ...用来显示模块的源路径,但是直接对源文件进行更改似乎没有任何效果(即,useREPL中的模块没有显示我的更改)。
我猜这是因为模块是预编译的,而当我以这种方式直接对模块源文件进行更改时,perl6不会接受我的更改并重新预编译模块...
更新:删除下面的相应预编译文件~/.perl6/precomp/...似乎可行,但是我不确定如何以及是否将任何东西弄乱了。
我正在尝试从 包装read函数unistd.h,但无法让它工作。下面是我有:(文件:read.raku)
use NativeCall;
# ssize_t read(int fd, void *buf, size_t count);
sub c_read(int32 $fd, Pointer $buf is rw, size_t $count --> ssize_t) is native is symbol('read') { * }
my $buf = Buf[byte].new(0 xx 5);
my $pbuf = nativecast(Pointer, $buf);
say c_read(3, $pbuf, 5);
say '---------------------';
say $buf;
Run Code Online (Sandbox Code Playgroud)
我像这样从命令行(bash)测试它:
use NativeCall;
# ssize_t read(int fd, void *buf, size_t count);
sub c_read(int32 $fd, Pointer $buf is rw, size_t $count --> ssize_t) is native is …Run Code Online (Sandbox Code Playgroud) 我有一个类和另一个继承自它的类。我在父类中定义了一些方法,我想与子类私下共享,但不与世界共享。
对于此类方法,如何在其他编程语言中实现类似受保护范围的功能?
我已经考虑过引入一个具有私有方法的角色,但我还需要维护一些私有状态以供方法使用,并且我需要使两个类都does成为角色,但这似乎导致了实例变量(角色)在两个班级中都重复...
class A {
has $.n;
# If this method is uncommented then the clone won't be sunk
# method clone {
# my $clone = callwith(|%_);
# return $clone;
# }
method sink(-->Nil) { say "sinking...$!n" }
}
sub ccc(A:D $a) { $a.clone(n=>2) }
ccc(A.new(n=>1));
say 'Done';
Run Code Online (Sandbox Code Playgroud)
上图:
sinking...2
Done
Run Code Online (Sandbox Code Playgroud)
但是,如果使用自定义clone方法,则返回的克隆 fromccc不会因某种原因沉没。如果我sink明确地在呼叫站点或将my $clone = callwith(|%_)线路更改为my $clone := callwith(|%_). 这是预期的吗?它以这种方式工作的原因是什么?
谢谢!
我想重用<< ... >>字符串上的解析逻辑来返回一个列表。比如说,我已经在一个变量中拥有了字符串$input,如何在不使用的情况下解析它EVAL(例如,EVAL "<< $input >>")?
一个更普遍的问题可能是:我如何重用各种引用构造(例如,qqww:v:!c)使用的任何解析逻辑?