Как использовать аргумент дважды в функции в J?

Я хочу написать основную функцию для изучения 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


person defhlt    schedule 16.08.2012    source источник


Ответы (2)


Вы можете просто определить глагол, используя : 3.

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

При использовании : 3 y всегда относится к правому аргументу глагола.

Если вы хотите определить двоичный глагол, используйте : 4 и x для левого аргумента.

Кстати, вы можете установить значение переменной где угодно:

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

Вы можете найти Руководство по определению глаголов на J Wiki. полезный.

Как уже упоминалось, вы можете взять свое предложение и определить его как глагол, используя следующий синтаксис:

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
person Tikkanz    schedule 16.08.2012
comment
Еще одна простая неявная версия: 1 { [: /:~ i. | ] но работает для целых чисел › 2. Например. ((1 { [: /:~ i. | ])"0 #]) 3+i.25, дает 3 5 7 11 13 17 19 23 - person Eelvex; 18.08.2012