J,创建一个函数

Lab*_*kak 3 primes numbers function j

我刚开始学习J,我试图创建一个函数来检查数字是否为素数.

<./<./13|*/~(2}.i.)13
Run Code Online (Sandbox Code Playgroud)

这将检查13是否为素数并返回1.

<./<./10|*/~(2}.i.)10
Run Code Online (Sandbox Code Playgroud)

这将返回0.

所以我的问题是:我如何制作一个功能呢?我如何指定参数?

prime(x) =: <./<./x|*/~(2}.i.)x
Run Code Online (Sandbox Code Playgroud)

这当然是行不通的.但是如何在J中创建此功能?

PS.我知道这个功能对2不起作用,我稍后再处理:D

kal*_*dic 6

为了用命名参数替换那些句子中的特定值,您可以使用脚本,如下所示:

   prime=: verb :'<./<./y|*/~(2}.i.)y'
   prime 13
1
   prime 10
0
Run Code Online (Sandbox Code Playgroud)

(这里'动词'这个词只是3.它作为冒号的左参数,而脚本体是冒号的右参数.但是可以随意忽略该细节,并将其视为一种模式'动词:'在引用的剧本主体之前.)

您会注意到我使用y而不是x作为参数名称.在显式J形式中,左参数是x(当有一个时)和右参数y.

在J中,动词接收不定形状的数组是很自然的,但如果给出除标量之外的任何内容,则上面定义的数组将会出错.这是一种解决方法:

   prime=: (verb :'<./<./y|*/~(2}.i.)y')"0
   prime 10 11 12 13
0 1 0 1
Run Code Online (Sandbox Code Playgroud)

作为一个风格问题,<./(至少之间)的重复可能无法传达您的意图以及此:

   prime=: (verb :'<./ , y|*/~(2}.i.)y')"0
Run Code Online (Sandbox Code Playgroud)

我想提一下,虽然像这样的程序非常适合探索语言,但是数字是否为素数是由J主要处理的.p:通常会使用该符号.如果需要指定的名称,并选择显式格式,这是一个典型的定义:

   prime=: verb :'1 p: y'
Run Code Online (Sandbox Code Playgroud)

和以前一样,'y'将被解释为命名动词("prime")的右参数的值.

总结:要指定参数,代替特定值,使用显式形式.这涉及一个脚本,即文本.在显式动词中,分别将'x'和'y'分别写为左右参数.如果你只使用一个参数,那就是'y'.

J程序员经常使用默认形式.在默认形式中没有脚本,并且始终隐含参数,未指定.(当更加舒适时,以明确的形式工作没有问题.)"显式"之所以被称为,因为在该形式中,参数被明确指出.