* > 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 达式,这意味着代码似乎没有,呃,结果是正确的。调查仍在继续...(不,我不是戒毒者)。谜团已揭开
因此,看起来逻辑操作(
&&
,||
,and
,or
等)不执行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年的一对夫妇似乎也具有潜在的重要性(尽管也许一个或多个不再适用?):