小编fin*_*fin的帖子

异步读取标准输出

我编写了这个简单的脚本,它每秒生成一个输出行(generator.sh):

\n
for i in {0..5}; do echo $i; sleep 1; done\n
Run Code Online (Sandbox Code Playgroud)\n

raku 程序将启动此脚本并在出现这些行时立即打印它们:

\n
my $proc = Proc::Async.new("sh", "generator.sh");\n$proc.stdout.tap({ .print });\nmy $promise = $proc.start;\nawait\xc2\xa0$promise;\n
Run Code Online (Sandbox Code Playgroud)\n

一切都按预期进行:每一秒我们都会看到一条新线。但是让我们用 raku 重写生成器(generator.raku):

\n
for 0..5 { .say; sleep 1 }\n
Run Code Online (Sandbox Code Playgroud)\n

并将程序的第一行更改为:

\n
my $proc = Proc::Async.new("raku", "generator.raku");\n
Run Code Online (Sandbox Code Playgroud)\n

现在出了点问题:首先我们看到输出的第一行(“0”),然后长时间停顿,最后我们看到输出的所有剩余行。

\n

我尝试通过命令获取生成器的输出script

\n
script -c \'sh generator.sh\' script-sh\nscript -c \'raku generator.raku\' script-raku\n
Run Code Online (Sandbox Code Playgroud)\n

在十六进制编辑器中分析它们,看起来它们是相同的:在每个数字之后,字节0d0a后面。

\n

为什么使用看似相同的发电机会产生如此大的差异?我需要理解这一点,因为我将启动一个外部程序并在线处理其输出。

\n

raku

13
推荐指数
1
解决办法
216
查看次数

执行外部程序后更改 $*SCHEDULER 时出现奇怪的行为

描述

有一个例子:

#!/bin/env raku
run 'raku', '-e', 'say "ok"';
exit 0;
my $*SCHEDULER = ThreadPoolScheduler.new(max_threads => 128);
Run Code Online (Sandbox Code Playgroud)

在linux上的输出是:

ok
Unhandled exception in code scheduled on thread 4
No such method 'cue' for invocant of type 'Any'
Run Code Online (Sandbox Code Playgroud)

在 Windows 上输出是:

Unhandled exception in code scheduled on thread 4
No such method 'cue' for invocant of type 'Any'
  in method throw at 'SETTING::'src/core.c/Exception.pm6 line 65
  in method schedule_thens at 'SETTING::'src/core.c/Promise.pm6 line 167
  in method keep at 'SETTING::'src/core.c/Promise.pm6 line 127
  in method keep …
Run Code Online (Sandbox Code Playgroud)

rakudo raku

11
推荐指数
1
解决办法
89
查看次数

将“is default”与数组哈希一起使用

这是工作示例:

my %hash;
for 1..4 -> $i {
    %hash{$i} = Array.new without %hash{$i};
    %hash{$i}.push: $_ for ^$i;
}
say %hash; # OUTPUT: {1 => [0], 2 => [0 1], 3 => [0 1 2], 4 => [0 1 2 3]}
Run Code Online (Sandbox Code Playgroud)

但为什么下一个类似的例子不起作用呢?

my %hash is default(Array.new);
for 1..4 -> $i {
    %hash{$i}.push: $_ for ^$i;
}
say %hash; # OUTPUT: {}
Run Code Online (Sandbox Code Playgroud)

这让我更加困惑,因为下一个示例按预期工作:

my %hash is default(42);
for 1..4 -> $i {
    %hash{$i}.=Str;
}
say %hash.raku; # OUTPUT: {"1" => "42", "2" …
Run Code Online (Sandbox Code Playgroud)

raku

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

如何使用结构体

我正在尝试从用 C 编写的共享库返回结构。这是简单的代码,用于测试返回结构和简单的 int32,libstruct.c编译者gcc -shared -Wl,-soname,libstruct.so.1 -o libstruct.so.1 libstruct.c

#include <stdint.h>

int32_t newint(int32_t arg) {
    return arg;
}

struct MyStruct {
    int32_t member;
};
struct MyStruct newstruct(int32_t arg) {
    struct MyStruct myStruct;
    myStruct.member = arg;
    return(myStruct);
}
Run Code Online (Sandbox Code Playgroud)

我可以通过简单的 C 程序来使用这个库,该程序usestruct.c由以下代码编译gcc -o usestruct usestruct.c ./libstruct.so.1

#include <stdio.h>
#include <stdint.h>

struct MyStruct {
    int32_t member;
};
extern struct MyStruct newstruct(int32_t);
extern int32_t newint(int32_t);

int main() {
    printf("%d\n", newint(42));
    struct MyStruct myStruct;
    myStruct = newstruct(42); …
Run Code Online (Sandbox Code Playgroud)

rakudo nativecall raku

7
推荐指数
2
解决办法
192
查看次数

标签 统计

raku ×4

rakudo ×2

nativecall ×1