Raku 邮编运算符 & space
Raku zip operator & space
我发现了这个连接来自多个文件的相同行的衬垫。
如何在两行之间添加一个space?
如果文件 A 的第 1 行是蓝色,文件 B 的第 1 行是天空,则获取蓝天,
但需要蓝天
say $_ for [Z~] @*ARGS.map: *.IO.lines;
这是利用 .Str
对 List
的副作用在元素之间添加空格:
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。
我发现了这个连接来自多个文件的相同行的衬垫。 如何在两行之间添加一个space?
如果文件 A 的第 1 行是蓝色,文件 B 的第 1 行是天空,则获取蓝天, 但需要蓝天
say $_ for [Z~] @*ARGS.map: *.IO.lines;
这是利用 .Str
对 List
的副作用在元素之间添加空格:
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。