我刚开始学习 J,并尝试创建一个检查数字是否为素数的函数。
<./<./13|*/~(2}.i.)13
这将检查 13 是否为素数并将返回 1。
<./<./10|*/~(2}.i.)10
这将返回 0。
所以我的问题是:我如何从中创建一个函数?如何指定参数?
prime(x) =: <./<./x|*/~(2}.i.)x
这当然行不通。但是我怎样才能在 J 中创建这个函数呢?
PS。我知道该功能不适用于 2,我稍后会处理:D
为了用命名参数替换这些句子中的特定值,您可以使用脚本,如下所示:
prime=: verb :'<./<./y|*/~(2}.i.)y'
prime 13
1
prime 10
0
(这里“动词”这个词只有 3。它充当冒号的左侧参数,而脚本主体是冒号的右侧参数。但是请暂时忽略该细节,并将其视为模式“动词:”在引用的脚本正文之前。)
您会注意到我使用 y 而不是 x 作为参数名称。在显式 J 形式中,左侧参数是 x(当有一个时),右侧参数是 y。
在 J 中,动词接收不定形状的数组是很自然的,但如果给定除标量之外的任何内容,上面定义的数组就会出错。这是解决此问题的方法:
prime=: (verb :'<./<./y|*/~(2}.i.)y')"0
prime 10 11 12 13
0 1 0 1
作为文体问题, <./ 的重复(最少)可能无法传达您的意图以及以下内容:
prime=: (verb :'<./ , y|*/~(2}.i.)y')"0
我想提一下,虽然像这样的程序非常适合探索语言,但判断一个数字是否为素数是由 J 初级处理的。p:
通常会使用该符号。如果需要指定的名称,并选择明确的形式,这是一个典型的定义:
prime=: verb :'1 p: y'
和以前一样,'y' 将被解释为命名动词(“prime”)的右参数的值。
总结:要指定参数,而不是特定值,使用显式形式。这涉及一个脚本,即文本。在显式动词中,将“x”和“y”分别写为左右参数。如果你只使用一个参数,它是'y'。
J 程序员经常使用默认形式来代替。在默认形式中,没有脚本,并且参数总是隐含的,而不是指定的。(当它更舒服时,以显式形式工作没有问题。)之所以称为“显式”,是因为在这种形式下,参数是显式指示的。