小编msc*_*cha的帖子

有没有办法在 Raku 中自动使用 FatRats?

Raku 的优点之一是,在适当的时候(例如,除两个整数时),它会自动使用有理数而不是浮点数。\n不幸的是,一旦分母变得太大,无论如何都会使用浮点数。

\n

有些FatRat类型不这样做,但据我所知,使用它们的唯一方法是显式地这样做。

\n

例如,此脚本计算 \xcf\x80 的数字:

\n
#!/usr/bin/env raku\n\nunit sub MAIN(Int $decimals = 1_000);\n\nsub atan_repr(Int $n, Int :$decimals)\n{\n    my $x = $n;\n    my $n2 = $n\xc2\xb2;\n    my $sign = 1;\n    my $limit = 10**($decimals+2);\n    my $result = FatRat.new(1, $x);\n    for 3,5...* -> $i {\n        $x \xc3\x97= $n2;\n        $sign \xc3\x97= -1;\n        $result += FatRat.new($sign, $i \xc3\x97 $x);\n        last if $x \xe2\x89\xa5 $limit;\n    }\n\n    return $result;\n}\n\nmy $\xcf\x80 = 4 \xc3\x97 (4 \xc3\x97 atan_repr(5, :$decimals) - atan_repr(239, :$decimals));\nmy $\xcf\x80-str …
Run Code Online (Sandbox Code Playgroud)

raku

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

如何"压缩"perl 6中的列表列表?

假设我想要a,b和c中的2个字母的所有排列.

我可以:

my @perm = <a b c>.combinations(2)».permutations;
say @perm;
# [((a b) (b a)) ((a c) (c a)) ((b c) (c b))]
Run Code Online (Sandbox Code Playgroud)

这很接近,但不完全是我需要的.我如何"扁平化"这样以便得到:

# [(a b) (b a) (a c) (c a) (b c) (c b)]
Run Code Online (Sandbox Code Playgroud)

perl6 raku

12
推荐指数
4
解决办法
364
查看次数

如何在Perl 6的列表中找到最大值的索引?

在Perl 6中找到列表中的最大值很容易:

> my @list = 1,4,9,7,3;
> say @list.max;
9
Run Code Online (Sandbox Code Playgroud)

但是如果我想找到最大条目的索引,似乎没有一种优雅的方法来做到这一点.

> say (^@list).sort({ -@list[$_] })[0];
2
> say @list.pairs.sort(*.value).tail.key;
2
> say @list.first(@list.max, :k);
2
Run Code Online (Sandbox Code Playgroud)

这些都是有效的,但它们并不优雅,更不用说高效了.

有一个更好的方法吗?

如果max:k,:v:kv选项,如例如,那将是很好的first.当然,也有可能不会一个独特的指数(例如,在的情况下(1,4,9,7,9).max,但话又说回来,有可能不是一个独特的价值之一:

> dd (1, 2.0, 2.0e0, 2).max;
2.0
> say <the quick brown fox>.max(*.chars);
quick
Run Code Online (Sandbox Code Playgroud)

max已经检索到第一个最大值,因此用(或)返回第一个索引是完全合理的.:k:kv

perl6 raku

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

如何检查Perl脚本是否在终端中运行?

我试图在Linux上的Perl脚本中确定它是否在终端中运行.

也就是说,我需要以下代码:

  • 只需在命令行上运行即可返回true
  • 运行时./myscript.pl | less甚至还会返回true./myscript.pl </dev/null >/dev/null 2>/dev/null
  • 在cron作业中运行时返回false,或作为CGI脚本返回false

特别是因为第二个子弹,我不能使用-t STDOUT和变化,IO :: Interactive也没用.

信息似乎确实可用.如果我运行ps,它显示的条目类似pts/2TTY专栏,甚至当我运行./myscript.pl </dev/null >/dev/null 2>/dev/null,并?作为cron作业或CGI脚本运行的时候.

有没有一种优雅的方法来在Perl脚本中确定这个?我宁愿不必解析输出ps.

linux perl tty

9
推荐指数
2
解决办法
9699
查看次数

如何解决“此 Seq 的迭代器已在使用中”?

这段代码:

sub MAIN(Int $N = 128)
{
    my @pascal = ((1,), { (0, |@^a) Z+ (|@^a, 0) } ... *);

    my @top = @pascal[^$N];
    say "Percentage of odd numbers in the first $N rows: ",
        (100 × @top».grep(* % 2).sum / @top.sum).fmt('%.12f%%');
}
Run Code Online (Sandbox Code Playgroud)

给我一个错误:

The iterator of this Seq is already in use/consumed by another Seq
(you might solve this by adding .cache on usages of the Seq, or
by assigning the Seq into an array)
  in sub MAIN at …
Run Code Online (Sandbox Code Playgroud)

raku

9
推荐指数
2
解决办法
109
查看次数

如何在Perl 6中声明哈希数字哈希?

默认情况下,哈希将所有键转换为字符串.当您的密钥是可能接近的数字时,这会导致问题:

> my %h; %h{1/3} = 1; %h{0.333333} = 2; dd %h;
Hash %h = {"0.333333" => 2}
Run Code Online (Sandbox Code Playgroud)

当然,这可以修复如下:

>  my %h{Real}; %h{1/3} = 1; %h{0.333333} = 2; dd %h;
Hash[Any,Real] %h = (my Any %{Real} = 0.333333 => 2, <1/3> => 1)
Run Code Online (Sandbox Code Playgroud)

但现在我需要哈希数字哈希,例如{ 1/3 => { 2/3 => 1, 0.666667 => 2 } }.

> my %h{Real}; %h{1/3}{2/3} = 1; %h{1/3}{0.666667} = 2; dd %h;
Hash[Any,Real] %h = (my Any %{Real} = <1/3> => ${"0.666667" => 2}) …
Run Code Online (Sandbox Code Playgroud)

perl6

8
推荐指数
1
解决办法
188
查看次数

如何在 Raku 中找到枚举的所有可能值?

enum Direction <north east south west>;
for north, east, south, west -> $dir {
    say $dir;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不想在这里重复方向值列表。我如何以编程方式获取此列表?

我在文档中没有找到任何内容。最接近的是.enums,但它返回(字符串)键到(整数)值的映射,而不是枚举值。

raku

8
推荐指数
1
解决办法
190
查看次数

在 Raku 中查找重复数字的优雅方法(née Perl 6)

我试图在一个数字中找到一组重复的数字,例如12334555611变成(1 2 33 4 555 6 11).

这有效:

$n.comb(/ 0+ | 1+ | 2+ | 3+ | 4+ | 5+ | 6+ | 7+ | 8+ | 9+ /)
Run Code Online (Sandbox Code Playgroud)

但不是很优雅。

有一个更好的方法吗?

regex raku

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

返回没有第 n 个元素的列表的优雅方法是什么?

返回没有第 n 个元素的列表的优雅且有效的方法是什么?我现在正在使用类似的东西:

my @b = @a;
@b.splice($n,1);
return @b;
Run Code Online (Sandbox Code Playgroud)

但这不是很优雅,而且可能也不是高效的。

(类似的东西return @b.spliced($n,1)会更好,但这不起作用。)

return flat @a[0..^$n,$n^..*]
Run Code Online (Sandbox Code Playgroud)

也好不了多少。

raku

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

无法在 Raku 中的单独行上使用序列运算符“...”

以下代码有效:

my @fibo = 1, 1, -> $a, $b { $a + $b } ...  *;
say @fibo[^10];
Run Code Online (Sandbox Code Playgroud)

输出:

(1 1 2 3 5 8 13 21 34 55)
Run Code Online (Sandbox Code Playgroud)

但是如果你将其分成多行,如下所示:

my @fibo = 1,
           1,
           -> $a, $b { $a + $b }
           ...
           *;
say @fibo[^10];
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误:

*
  in block <unit> at ./dotdotdot line 4
Run Code Online (Sandbox Code Playgroud)

在这种情况下, 似乎...被解释为 yada 运算符。但不应该,不是吗?两个版本的代码应该是等效的。(这不是 Python,空格应该是无关紧要的。)

作为解决方法,以下内容确实可以正常工作:

my @fibo = 1,
           1,
           -> $a, $b { $a + $b } ...
           *;
say …
Run Code Online (Sandbox Code Playgroud)

raku

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

标签 统计

raku ×8

perl6 ×3

linux ×1

perl ×1

regex ×1

tty ×1