Raku 邮编运算符 & space

Raku zip operator & space

我发现了这个连接来自多个文件的相同行的衬垫。 如何在两行之间添加一个space?

如果文件 A 的第 1 行是蓝色,文件 B 的第 1 行是天空,则获取蓝天, 但需要蓝天

say $_ for [Z~] @*ARGS.map: *.IO.lines;

这是利用 .StrList 的副作用在元素之间添加空格:

say .Str for [Z] @*ARGS.map: *.IO.lines

Z 将创建 2 个元素 List 对象,然后 .Str 将其字符串化。

或更短:

.put for [Z] @*ARGS.map: *.IO.lines

其中 .put 将为您调用 .Str 并输出它。

如果您还想要其他任何东西,那么您可以使用 .join:

say .join(",") for [Z] @*ARGS.map: *.IO.lines

会在单词之间加上逗号。

注意:绝对不要在任何接近真实代码的地方这样做。使用 Liz 答案中的(一种)可读方式。

如果你真的想要使用与[Z~]相同的结构——即一个由Zip元操作符修改的操作符,都在Reduce元操作符中接线员——你可以。但这并不漂亮:

say $_ for [Z[&(*~"\x20"~*)]] @*ARGS.map: *.IO.lines

这是它的工作原理:Z 可以接受一个运算符,所以我们需要给它一个运算符来连接两个字符串,中间有一个 space。但是没有内置的运算符。没问题——我们可以通过用 [ ]infix form)包围任何函数将其变成中缀运算符。

所以我们所需要的只是一个函数,它连接两个字符串,它们之间有 space。 不存在,但我们可以创建一个:* ~ ' ' ~ *。所以,我们应该能够将它推入我们的中缀形式并将整个东西传递给 Zip 运算符 Z[* ~ ' ' ~ *].

除非那不起作用。因为 Zip 并不是 真正 期待中缀形式,我们需要给它一个提示,表明我们正在传递一个函数……也就是说,我们需要将我们的函数放入一个可调用的 context&( ),这让我们到达 Z[&(* ~ ' ' ~ *)].

Zip 表达式在中缀位置使用时可以满足我们的要求——但是一旦我们将它放回 Reduce/[ ] 运算符,它仍然 不起作用我们要使用的。这一次,问题是由于某些可能是也可能不是错误的东西引起的——即使在 discussing it with jnthn on github 之后,我仍然不确定这种行为是否是 intended/correct.

具体来说,问题是 Reduction 元运算符 doesn't allow whitespace – 即使在字符串中也是如此。因此,我们需要将 * ~ ' ' ~ * 替换为 *~"\c[space]"~**~"\x20"~*(其中 \x20 是 Unicode/ASCII 中 的十六进制值)。既然我们已经深入了解混淆代码,我想我们不妨一路走下去。这让我们回到

say $_ for [Z[&(*~"\x20"~*)]] @*ARGS.map: *.IO.lines

再次声明,我建议您这样做。 (而且,如果你这样做了,你至少可以通过将 * ~ ' ' ~ * 函数保存为上一行中的命名变量来稍微提高它的可读性,这至少会让你变白 space。但是,真的,只需使用 Liz 的建议之一)。

我只是认为这为 Raku 奇怪的一致行为的一些更黑暗和更有趣的角落提供了有用的 window。