我发现脚本成瘾者加入 raku 的一个巨大卖点就是拥有这样的结构
my $w = "Hello world";
$w
~~ s/Hello/Hola/
~~ s/world/mundo/
;
say $w; # » Hola world
Run Code Online (Sandbox Code Playgroud)
但是我似乎无法写出这样的东西。据我所知,用 的.subst方法做这件事Str太丑了,这种连锁
s///甚至tr///基本上也将成为sed用户等的入门药物。
我的问题是我是否遗漏了某些东西,如果在 raku 中以某种方式可能会出现与此类似的东西。我不是初学者,我无法弄清楚。
在 APL 中有幂运算符?,如果将其应用于函数,则会f叠加f. 如何在 Raku 中实现该运算符?
例如,使用以下定义f:
sub f(Int:D $i){ $i + 1 }
Run Code Online (Sandbox Code Playgroud)
该命令say (f ? 4)(10);应等效于say f(f(f(f(10))));.
我在下面的实现是针对一个带有一个参数的函数。
如何使用适用于多个(或任何)签名的更好的实现来扩展或替换它?
如何定义该新电力运营商的“高优先级”?
有没有更好的方法来定义“身份函数”结果f ? 0?
这是 APL 的描述?:
“Power Operator”。
(?是一个“带两个点的星星”,或者更正式的“Apl 功能符号 Star Diaeresis”。)
这是一个实现的尝试:
sub infix:<?>( &func, Int:D $times where $times >= 0 ) {
if $times == 0 {
sub func2($d) {$d}
} else …Run Code Online (Sandbox Code Playgroud) 我有机会使用Rakudo编译器在Perl 6上进行为期两天的课程.
我不想发动宗教战争,但值得我花时间吗?有没有理由相信Perl 6将在未来两年内在现实世界中实用?目前有人有效使用它吗?
更新
我上了课,学到了很多东西.然而,在第1天之后,我的思绪有点不知所措.Perl 6中有很多很酷的想法,看看有什么过滤到其他语言是很好的.
总的来说,这次经历积极地利用了我的时间,尽管我在第二天无法吸收太多.如果这是一个为期三天的课程,那么仅仅因为你可以在很短的时间内处理多少是有限的.
我一直在研究在Perl 6中构造惰性列表的各种方法,我想收集描述Fibonacci序列的所有简洁方法.
我将从马萨克的期刊中的三个开始:
my @fibs := (0, 1, -> $a, $b { $a + $b } ... *);
my @fibs := (0, 1, { $^a + $^b } ... *);
my @fibs := (0, 1, *+* ... *);
Run Code Online (Sandbox Code Playgroud)
我认为这样的东西也会起作用,但我认为我的语法有误:
my @fibs := (0, 1, (@fibs Z+ @fibs[1..*]));
Run Code Online (Sandbox Code Playgroud)
有什么东西急切(切片?)并导致Rakudo进入无限循环.它是Haskell定义的翻译:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
更新:
看起来像zipWith示例的问题是@fibs[1..*]切片.if tail定义为sub tail (@x) {my $i = 1; {@x[$i++]}...*}然后它正常工作.我很想知道为什么切片对任何熟悉Rakudo内部的人来说都不是懒惰的.
另一个不错的是:
my …Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法将方法和/或子绑定到 Raku 中的另一个方法/子名称。我已经看到如何将变量绑定到方法/子,但这并不是我想要的。我知道如何在 Perl 5 中做到这一点:
sub sub1 {
print "sub1!\n";
}
*sub2 = \&sub1;
sub1(); # sub1!
sub2(); # sub1!
Run Code Online (Sandbox Code Playgroud) Haskell 和 Rust(以及我不知道的其他语言)有一个他们称之为“模式匹配”的发展。下面是 Haskell 中的一个例子:
data Event = HoldKey Char | PressKey Char | Err String
someFunc = let
someEvent <- doSomeStuff
-- What follows is a case expression using pattern matching
thingINeed <- case someEvent of
HoldKey keySym -> process keySym
PressKey keySym -> process keySym
Err err -> exit err
in keepDoingStuff
Run Code Online (Sandbox Code Playgroud)
在 Raku 中与此最接近的似乎是 多方法 multifunctions(术语在下面的答案中固定,但 multimethods 也可以工作)。
class Hold { has $.key; }
class Press { has $.key; }
class Err { has $.msg; }
multi …Run Code Online (Sandbox Code Playgroud) 在 Perl 中,表达式"aa" .. "bb"创建一个包含字符串的列表:
aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb
Run Code Online (Sandbox Code Playgroud)
然而,在 Raku 中(至少在 Rakudo v2021.08 中),相同的表达式创建:
aa ab ba bb
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,"12" .. "23"在 Perl 中创建一个包含数字 12、13、14、15、...、23 的字符串列表,而在 Raku 中相同的表达式创建列表("12", "13", "22", "23")。
文档似乎对这种行为保持沉默;至少,我在那里找不到解释。有什么方法可以得到 Raku 范围内的 Perl 行为吗?
(我知道第二个问题可以通过类型转换为 Int 来解决。但这不适用于第一个问题。)
给定单词abcd,我将如何构建以下嵌套列表?
[ (abcd) (a bcd) (ab cd) (abc d) (a b cd) (a bc d) (ab c d) (a b c d) ]
Run Code Online (Sandbox Code Playgroud)
即以各种可能的方式拆分单词,同时保持字母顺序。
#raku-beginner 上的 Nemokosch 向我指出了.combinations该模块snip,但我无法将它们组合在一起。
我最近和Rakudo Perl 6一起玩,正在寻找类似于CPAN的项目.我找到了CPAN 6,但我认为还没有Perl 6代码.
所以我正在寻找一些替代方案,它不一定是长期解决方案,但能够维护模块,并用Perl 6编写.
随着Rakudo的发展,很快就可能创建更复杂的Perl 6代码.