Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Rich H.J for C programmers.2006.pdf
Скачиваний:
19
Добавлен:
23.08.2013
Размер:
1.79 Mб
Скачать

15. Verbs for Arithmetic

It's time to build your J vocabulary with a few more verbs.

Dyads

x ! y (rank 0 0) number of ways to choose x things from a population of y things. More generally, (!y) % (!x) * (!y-x)

x %: y (rank 0 0) The xth root of y

x#. y (rank 1 1) y evaluated in base x, i. e. the atoms of y are digits in the base-x representation. x and y must have the same length, unless x is a scalar in which case it is replicated to the length of y . A place-value list p is calculated, in which each item is the product of all the subsequent corresponding items of x; formally, this is p=.*/\.}.x,1 (the last item of p is always 1 and the first item of x is immaterial). Then each item in y is multiplied by its place value and the results are summed to give the result (formally this is +/ y * p). In the simplest case x is a scalar:

10 #. 2 3 4

234

The digits 2 3 4 interpreted as base-ten digits.

16 #. 2 3 4

564

The same interpreted as base-sixteen digits.

16b234

564

as expected (16b234 is 234 in base 16, equivalent to 0x234).

Here is an example where x is a list, converting time in hours/minutes/seconds to seconds since midnight:

24 60 60 #. 12 30 0

45000

The list p was 3600 60 1 . The first item in x has no effect on the result.

x#: y (rank 1 0) This is the inverse of x #. y except that if the first digit of the result is not between 0 and {.x, it is changed (modulo x) to lie within that range.

For example,

24 60 60 #: 45000

12 30 0

The normal case, converting the number of seconds since midnight back to hours/minutes/seconds.

93

24 60 60 #. 36 30 0

131400

24 60 60 #: 131400

12 30 0

Here the result would have been 36 30 0, but 36 is outside the range 0 to 24, so it is replaced by 24|36, which is 12 . If you want the first item of the result to be unconstrained, make the first item of x either 0 or _ :

0 60 60 #: 131400

36 30 0

Note that monad #: and monad #. are similar to the dyadic forms with x set to 2 . To keep #: and #. straight in your mind, remember that the one with a single dot (#.) produces a single scalar result, while the one with multiple dots (#:) produces a list result.

Monads (all rank 0)

! y factorial of y (more generally, the gamma function Γ(1+y)) ^ y same as (the base of natural logarithms e) ^ y

^. y same as (the base of natural logarithms e) ^. y +: y same as y * 2

-: y same as y % 2 *: y same as y ^ 2 %: y same as 2 %: y

You can see the common feature in the arithmetic primitives ending in : .

94