WhateverStar` &&在Perl 6中的WhateverStar

che*_*nyf 9 perl6 raku

* > 20 && * %% 5用于grep似乎错误,是否等于WhateverCode lambda采取2个参数?正如这个解释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)
Run Code Online (Sandbox Code Playgroud)

rai*_*iph 8

Golfed

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

say .signature, .(1), .(2)
  for &or, ∧
Run Code Online (Sandbox Code Playgroud)

显示:

(;; $whatevercode_arg_1 is raw)TrueFalse
(;; $whatevercode_arg_4 is raw)FalseTrue
Run Code Online (Sandbox Code Playgroud)

我仍然不知道发生了什么事情,但签名是不是只是一个ARG,其结果是按照刚才右手表达的很清楚&and和左手的&or,这意味着该代码似乎并不具备,呃,留下的结果是,呃,对.调查仍在继续......(不,我不是叛徒).

谜团已揭开

因此,它看起来像逻辑OPS( ,&&,||,and,or等)不做Whatever-currying.考虑到"并非所有运算符和句法结构都是curry *(或Whatever-stars)WhateverCode",这是公平的.逻辑,甚至,鉴于其性质.它们可能应该被添加到该页面上的例外表中.

在此期间,如运营商== Whatever咖喱.再次,这是公平的,因为"子表达式可能强加他们自己的无论明星规则".

因此有意义&or&and转向......

啊哈!得到它了.该* == 1* == 2在编译时进行评估,变成WhateverCode秒.因为WhateverCode它们只是代码的一部分.它们是定义的.他们是True.(这忽略了在运行时调用它们.)然后沿着它来&&评估右手WhateverCode.(||将评估它的左手WhateverCode.)

因此我们看到的行为.

一个办法

每通过@HåkonHægland提示,该代码工作,因此是不依赖于逻辑OPS代码Whatever-currying,即:

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

say @a.grep: { $_ > 20 && $_ %% 5 } # (25 30 35)
Run Code Online (Sandbox Code Playgroud)

怎么办?

现在我们必须弄清楚要编写的文档编辑内容......

实际上,在我们这样做之前,确认逻辑操作不应该是Whatever...

为了开始那个滚动,我只是搜索了TimToady#perl6关于"currying"的评论的结果(#perl6-dev上没有),寻找与我们这里的情况相关的那些.

首先,2017年的一个可以说与任何文档编辑相关:

设计文档实际上试图避免使用"currying"这个词......但很难让人们使用与他们不同的词语

接下来,一个从2015年约&&,并||与这样的:

||而且&&这些实际上是控制流操作员,转而迅速变成'如果'和'除非'......这些操作可以用.assuming,我假设

最后,2010年的一对夫妇似乎也很重要(虽然可能有一个或多个不再适用?):

所有操作员都自动加油WhateverCode,无论他们是否咖喱Whatever

我认为我们可以将当前机制保留为仍然希望在运行时进行咖喱的运营商的后备机制

  • @HåkonHægland鉴于逻辑运算不是'Whatever`-curry,所以写它不依赖于它:`{$ _> 20 && $ _ %% 5}`应该有效.是的,经过测试,有效. (2认同)