Perl 6 中的无论什么星 `&&` 无论什么星

2023-12-19

* > 20 && * %% 5用于grep似乎是错误的,是否等于带有 2 个参数的WhateverCode lambda?正如这解释的那样SO https://stackoverflow.com/questions/50245452/find-last-friday-s-date-in-perl-6/50257189#50257189

> 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)

Golfed

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:也就是说,我在写这一段时并不知道;随着谜团的揭开,我保留了我在这个答案中所写的内容],但很明显,签名仅针对一个参数,而结果只是按照右手表达式&and左手为&or这意味着代码似乎没有,呃,留下了,呃,正确的结果。调查仍在继续......(不,我没有重复)。

谜团已揭开

所以,它看起来像逻辑操作(&&, ||, and, or等)不做Whatever-柯里化。鉴于此,这是足够公平的“并非所有运算符和语法结构都柯里化* (or Whatever-星)到WhateverCode" https://docs.perl6.org/type/Whatever。考虑到它们的本质,这甚至是合乎逻辑的。不过,它们可能应该添加到该页面上的例外表中。

与此同时,运营商喜欢== do Whatever咖喱。再说一遍,这很公平“子表达式可能会强加自己的任何星号规则” https://docs.perl6.org/type/WhateverCode.

所以这是有道理的&or and &and变成...

啊哈!知道了。这* == 1 and * == 2在编译时评估并变成WhateverCodes. As WhateverCode它们只是一些代码。它们是被定义的。他们是True。 (这会忽略在运行时调用它们。)然后出现&&并评估右手WhateverCode. (The ||将评估其左手WhateverCode.)

因此我们看到了这种行为。

一个办法

根据 @HåkonHægland 的提示,代码would因此,工作是不依赖于逻辑操作的代码Whatever-柯里化,即:

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

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

怎么办?

现在我们必须弄清楚要编辑哪些文档以提出建议......

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

为了开始这个计划,我刚刚搜索了搜索结果(#perl6-dev 上没有),正在寻找与我们这里的案例相关的内容。

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

设计文档实际上试图避免使用“柯里化”这个词……但是很难让人们以不同的方式使用单词

接下来是2015年的一篇关于&& and ||等等:

|| and &&这些实际上是控制流运算符,很快就变成了“如果”和“除非”......这些操作可以用柯里化.assuming, 我假设

最后,2010 年的一些似乎也可能很重要(尽管也许其中一个或多个不再适用?):

所有运算符都自动柯里化 aWhateverCode,无论他们是否柯里化Whatever

我认为我们可以保留当前的机制作为仍想在运行时进行柯里化的操作员的后备方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl 6 中的无论什么星 `&&` 无论什么星 的相关文章

随机推荐