* > 20 && * %% 5中使用的grep似乎是错误的,是否等于需要2个参数的WhateverCode lambda?像这样在SO上解释

> my @a = 1,12,15,20,25,30,35,37;

> @a.grep: * > 20 && * %% 5 # The result seems strange, expected (25 30 35)
(15 20 25 30 35)

> @a.grep: * %% 5 && * > 20
(25 30 35 37)

> @a.grep: { $_>20 && $_ %% 5 }
(25 30 35)

> @a.grep: all(* > 20, * %% 5)
(25 30 35)

> @a.grep: -> $a { all($a > 20, $a %% 5) }
(25 30 35)

> @a.grep: -> $a {$a > 20 && $a %% 5}
(25 30 35)

最佳答案

打高尔夫球

my &or  = * == 1 || * == 2 ;
my &and = * == 1 && * == 2 ;

say .signature, .(1), .(2)
  for &or, ∧
显示:
(;; $whatevercode_arg_1 is raw)TrueFalse
(;; $whatevercode_arg_4 is raw)FalseTrue
我仍然不知道发生了什么事[ed:就是说,当时我还没有写这一段。我一直把我在这个答案中写的内容作为谜底展开],但很明显,签名仅针对一个arg,结果仅针对&and的右 watch 达式,而针对&or的左 watch 达式,这意味着代码似乎没有,呃,结果是正确的。调查仍在继续...(不,我不是戒毒者)。
谜团已揭开
因此,看起来逻辑操作(&&||andor等)不执行Whatever -currying。鉴于"not all operators and syntactic constructs curry * (or Whatever -stars) to WhateverCode ",这是足够公平的。考虑到它们的性质,甚至是逻辑上的。不过,可能应该将它们添加到该页面上的异常(exception)表中。
同时,像==这样的运算符也会执行Whatever curry。同样,给定"subexpressions may impose their own Whatever star rules"就足够了。
因此&or&and变成...是有道理的
啊哈!知道了。在编译时评估* == 1* == 2,并将其转换为WhateverCode。作为WhateverCode,它们只是代码的一部分。它们已定义。它们是True。 (这将忽略在运行时调用它们。)然后是&&,并求值为右手WhateverCode。 (||的求值为左手WhateverCode。)
因此,我们看到的行为。
一个解法
根据@HåkonHægland的提示,因此有效的代码就是不依赖于逻辑操作Whatever -currying的代码,即:
my @a = 1,12,15,20,25,30,35,37;

say @a.grep: { $_ > 20 && $_ %% 5 } # (25 30 35)
怎么办?
现在我们必须弄清楚要提出哪些文档编辑...
实际上,在执行此操作之前,请确认逻辑操作应该不是Whatever -curry ...
为了开始进行滚动,我只是拖拽了搜索 TimToady comments on #perl6 about "currying"的结果(#perl6-dev上没有),寻找与我们这里遇到的情况相关的结果。
首先,可以说与2017年的任何文档编辑都有关的一个:

接下来,从2015年开始,有关&&||的内容如下:

最后,来自2010年的一对夫妇似乎也具有潜在的重要性(尽管也许一个或多个不再适用?):

10-07 14:58