Vocabulary/tilde

From J Wiki
Jump to navigation Jump to search

>> <<   Back to: Vocabulary Thru to: Dictionary

~ Reflex Adverb

Rank Infinity -- operates on x and y as a whole -- WHY IS THIS IMPORTANT?



(u~ y) is the same as (y u y)

u is executed as a dyad with x=y

   +~ 1 2 3
2 4 6

   y=. 6 3 2
   y +/ .* y         NB. computing the dot product of y and itself
49
   %: y +/ .* y      NB. taking the square root to get the vector length
7
   %: +/ .*~ y       NB. omitting left argument by using Reflex on verb (+/ .*)
7

                     NB. Source of this gem: [Jchat] 'One day ...', Raul Miller, 2017-12-11
   */^~1+i.5x        NB. using (^~) instead of (]^])
86400000
   24*60*60*1000     NB. one day (in millisecs)
86400000

Common uses

1. Produce an operator table

avoids having to specify the same noun as both left and right arguments

   */~ i.10   NB. instead of: (i.10) */ (i.10)
0 0  0  0  0  0  0  0  0  0
0 1  2  3  4  5  6  7  8  9
0 2  4  6  8 10 12 14 16 18
0 3  6  9 12 15 18 21 24 27
0 4  8 12 16 20 24 28 32 36
0 5 10 15 20 25 30 35 40 45
0 6 12 18 24 30 36 42 48 54
0 7 14 21 28 35 42 49 56 63
0 8 16 24 32 40 48 56 64 72
0 9 18 27 36 45 54 63 72 81

2. Sort an array.

Sort x /: y is defined as sorting x into the order specified by y. To sort an array into ascending (or descending) order, x and y must be the same, so use /:~ or \:~

   /:~ 3 1 4 1 5 9 2 6 5 3 5
1 1 2 3 3 4 5 5 5 6 9
   \:~ 2 7 1 8 2 8 1 8 2 8 4
8 8 8 8 7 4 2 2 2 1 1

3. Self-classify.

To find the sets of identical items, use i.~ y which looks for each item of y within y itself. The result will split y into classes of identical values:

   pi =: 3 1 4 1 5 9 2 6 5 3 5   NB. A list

   ]classes =: i.~ pi  NB. a class for each item
0 1 2 1 4 5 6 7 4 0 4
   pi ,: classes    NB. classes shown beneath items
3 1 4 1 5 9 2 6 5 3 5
0 1 2 1 4 5 6 7 4 0 4

4. Apply u on sets of identical items of y. Use u/.~ y which applies u to each set of identical items. One thing you could do is count them:

   pi =: 3 1 4 1 5 9 2 6 5 3 5
   (~. pi) ,: #/.~ pi  NB. Show counts beneath the unique values
3 1 4 5 9 2 6
2 2 1 3 1 1 1


~ Passive Adverb

Rank -- depends on the rank of u -- WHY IS THIS IMPORTANT?


Swaps the arguments of a dyad. Thus, x u~ y is the same as y u x .

   3 - 4
_1
   3 -~ 4        NB. arguments are swapped
1
   3 -~~ 4       NB. reverting to previous state of affairs with (u~)~
_1

   7 |~ 2        NB. 7 modulo 2
1

x u~ y is never necessary, since you can achieve the same effect with parentheses, but it can make code shorter or easier to read

   ] digits=. (48 + i. 10) { a.     NB. calling From
0123456789
   ] digits=. a. {~ 48 + i. 10      NB. same, using Passive
0123456789

   i. 11
0 1 2 3 4 5 6 7 8 9 10
   (i. 11) % 10              NB. defining 10 equally spaced sections in interval [0;1],
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
   10 %~ i. 11               NB. getting rid of parentheses using Passive,
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
   10 %~ i. >: 10            NB. reducing to same argument,
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
   (%~ [: i. >:) 10          NB. argument "factored out"
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

Common uses

1. x u~ y will save parentheses if you would need parentheses around y in y u x.

   boxedline =: <'A line of text'
   (> boxedline) , CRLF  NB. Unbox text and append CRLF
A line of text

   CRLF ,~ > boxedline   NB. Same effect without parentheses
A line of text

2. u~ can avoid the use of [ and ] in tacit forms:

   5 (+:@[ + ]) 10   NB. Double x and add to y
20
   5 (+~ +:)~ 10   NB. Same without []
20

3. J style is for dyads to accept "data" as y, with "control information" as x. x u~ y can be used if a verb is mis-specified, or if you want the other order. Examples of J primitives that are backwards for historical reasons are %, e., -, and -.

   'abcde' i. 'ef'   NB. Find index of y in x
4 5
   'abcde' e.~ 'ef'  NB. is y in x?
1 0

Another exception from the rule is Sort (x /: y) which expects the "data" as x and the sort order ("control information") as y; where that seems inconvenient one may use (x /:~ y) to sort y into the order specified by x.

4. /:~~ is a cute trick:

  • the monad /:~~y is equivalent to y /: y, i.e. it sorts y
  • the dyad x /:~~ y is equivalent to x /: y, i.e. it sorts x into the order specified by y .