正面和下方(2019年)

2020-09-12 00:08:16

我以前写过关于使用J编程语言绘制“令人惊叹的图形”的文章。我得到的解决方案类似于以下内容:

需要';Plot';f=:]-[:#。[:|。#:';点类型绘图f";0 p:i.10000。

我们的动词f采取了一种非常明确的方法,明智地使用了“上限”([:)动词序列。我们实质上是说f是(=:)给定的数字(])减去(-)基数2(#)。反之(|)。给定数的反碱基二(#:)。

J社区的几位成员向我指出,这个动词可以借助“Under”(&;)来简化。连词。让我们深入研究一下什么是“下方”,以及我们如何使用它。

考虑“下”(&;)的最好方式,正如NUVOC关于“下”的页面所解释的那样,就是从域和域内外的转换的角度来思考。

动词v定义了论元(x和y)到v域的转换,然后,动词u对转换后的论元进行操作,最后将结果从v域转换回原始域。

在我们的示例中,我们的输入域是基数10,但是我们想要应用的转换(反转)需要在基数2的域中发生。“Under”(&;)。可以用来将我们的输入转换为基数2(#:),应用我们的反转(|.),并将该反转的结果用我们的基数2动词反基数(#.)的反面(#.)转换回原始的基数十进制域:

请注意,我们并没有明确说明如何将逆转的结果转换回我们的原始域。J知道#:的正面是#.,并自动为我们应用它。

开箱即用的J有很多正面配对。例如,“Open”(>;)是“box”(<;)的反面,反之亦然。将变换应用于装箱的值时,此配对特别有用:

1+amp;。>;1;2;3┌─┬─┬─┐│2│3│4│└─┴─┴─┘。

在这篇“J的阴影”文章的结尾处查看正面对的完整列表。

即使由具有明确正面配对的动词组成的复合动词也可以与“Under”(&;)连用。J将在没有任何干预或指导的情况下正确地推断和应用复合正面。

例如,如果我们想要打开一个值列表的包装箱,然后在“平方根域”(不管这意味着什么)中使用它们,我们可以这样做:

1+&;。([:%:>;)1;2;3┌─┐│4 5.82843 7.4641│└─┘。

J取每个值,打开它并找到它的平方根([:%:>;),将结果加1,然后对递增的值进行平方和装箱([:*:<;)。

更有趣的是,如果一个正向配对对于给定的动词是不可定义或不可推断的,J允许我们使用“正向”(:.)来定义我们自己的配对。动词。

例如,假设我们有一个JSON字符串,其中包含一个值数组。我们希望解析字符串,对这些值执行一些操作,然后将结果列表序列化为JSON。

我们可以使用Convert/json包提供的dec_json和enc_json动词,并告诉J dec_json的正面是enc_json:

在像';[1,2,3]';这样的JSON数组上运行dec_json将返回已装箱数字的列表,因此我们需要打开每个框,执行操作,然后将结果装箱。这听起来像是“Under”(&;)的另一份工作:

“Under”绝对是一个非常强大的连词,我可以预见自己将来会广泛使用它。感谢J社区的每一个人,他们都很友善地指出了这一点,并教会了我一些新的东西!