如何在J中的函数中使用两次参数?

时间:2012-08-16 06:52:58

标签: arrays j tacit-programming apl

为了学习J.,我想写主要功能。 到目前为止,我已经想出了这个:

=&0+/(=&0)(2+i.(-&2)y)|y

除了我应该将号码存储在y变量中之外,它的效果很好。

   y=.5       
   =&0+/(=&0)(2+i.(-&2)y)|y NB. prime cheker
1
   y=.13       
   =&0+/(=&0)(2+i.(-&2)y)|y NB. prime cheker
1
   y=.14
   =&0+/(=&0)(2+i.(-&2)y)|y NB. prime cheker
0

如何编写一个有效参数的函数?即f 13 - > 1

2 个答案:

答案 0 :(得分:1)

您可以使用: 3 define动词。

f =: 3 :'=&0+/(=&0)(2+i.(-&2)y)|y'
f 5
1
f 13
1
f 10
0

使用: 3时,y始终引用动词的右手参数。

如果要定义二元动词,请使用: 4x作为左参数。

顺便说一下,您可以在任何地方设置变量的值:

   =&0+/(=&0)(2+i.(-&2)y)|y=.5
   1
   =&0+/(=&0)(2+i.(-&2)y)|y=.10
   0

答案 1 :(得分:1)

您可能会发现J Wiki上的Defining Verbs指南很有用。

正如已经提到的,您可以使用以下语法将您的句子定义为动词:

isPrime0=: 3 : '=&0+/(=&0)(2+i.(-&2)y)|y'

然而,写这样的话可能更自然:

isPrime1=: 3 : '0 = (+/ 0 = (2 + i. y - 2) | y)'

你也可以像以下任何一样定义一个默认版本(不引用参数):

isPrime2=: 0 = [: +/ 0 = ] |~ 2 + [: i. 2 -~ ]
isPrime3=: 0 = [: +/ 0 = ] |~ 2 + i.@:-&2        NB. replace train with verb composed using conjunctions
isPrime4=: 0 = [: +/ 0 = ] |~ i.&.(-&2)          NB. use Under to re-add the 2 after Integers
isPrime5=: 0 -.@e. i.&.(-&2) | ]                 NB. check no zero in result