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

Result

 

Processing of {.@:>

 

 

 

 

 

 

 

of }.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Result

Result

 

 

 

 

 

 

 

 

 

 

 

 

(final

Result of

 

Cells of

 

Cells of }.@({.@:>)

result)

{.@:>

of {.

of >

 

 

{.@:>

 

 

 

 

 

 

1 2 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2 3

 

4 5

 

6 7 8

 

 

1 2 3

4 5

6 7 8

 

2 3

1 2 3

1 2 3

4 5 0

 

 

 

 

 

 

 

 

 

6 7 8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Verb 5 ({.@>@}.) is equivalent to ({.@>)@}. which has infinite rank because }. does. The list of boxes, taken in full, is beheaded and the result (4 5;6 7 8) passed to ({.@>). This verb has rank 0 (from >), so each box is individually opened and the first item taken, giving the result 4 6 .

 

 

Processing of {.@>

 

 

 

 

 

 

 

 

Final

Result of

Result

Result

 

Cells

 

Cells of {.@>@}.

result

{.@>

of {.

of >

 

of {.@>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

4

4 5

 

4 5

 

 

 

 

 

 

 

4 6

 

 

 

 

1 2 3

4 5

6 7 8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

6

6 7 8

 

6 7 8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Verb 6 ({.@:>@}.) is equivalent to ({.@:>)@}. which is like verb 5 except that ({.@:>) has infinite rank. When the beheaded list of boxes (4 5;6 7 8) is presented to this verb, the whole list is processed at once: it is opened and filled with zeros to produce an array of shape 2 3, then the first item is taken giving 4 5 0 (the 0 was added as a fill when the list was opened).

 

 

Processing of {.@:>

 

 

 

 

 

 

 

 

Final

Result of

Result

Result

 

 

Cells

 

Cells of {.@:>@}.

result

{.@:>

of {.

of >

 

of {.@:>

 

 

 

 

4 5 0

 

 

 

 

 

 

 

 

 

 

4 5 0

4 5 0

4 5 0

 

4 5

 

6 7 8

 

 

1 2 3

4 5

6 7 8

 

6 7 8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Making a Monad Into a Dyad: The Verbs [ and ]

The characters [ and ] are not paired in J; each is an independent verb. This is jarring at first but you'll get used to it.

[ and ] are identity verbs: they have infinite rank, and ] y and [ y both result in y . As dyads, they pick one operand: x [ y is x, and x ] y is y . They can be useful when you have a monadic verb that for one reason or another must be used as a

dyad with an unwanted operand: then x v@:[ y applies v to x, and x v@:] y applies v to y . Example:

84

1 2 3 {.@:[ 4 5 6

1

Here are some other uses of [ and ] . We have already met the first one, which is to display the result of an assignment:

a =. 1 2 3 produces no typeout, but

]a =. 1 2 3 1 2 3

Second, [ can be used to put multiple assignments on the same line, since each application of [ ignores what is to its right:

a =. 5 [ b =. 'abc' [ c =. 0

Finally, ] can be used instead of parentheses to separate numbers that would otherwise be treated as a list:

 

5 ,"0

1 2

 

 

|syntax error

2

|

5

,"0

1

5

5 ,"0

(1

2)

 

1

 

 

 

5

2

 

2

 

5

5 ,"0 ] 1

 

1

 

 

 

5

2

 

 

 

Making a Dyad Into a Monad: u&n and m&v

A dyadic verb takes two operands, but if you know you are going to hold one fixed, you can create a monadic verb out of the combination of the dyad and the fixed operand; the monad's operand will be applied to whichever operand of the dyad was not held fixed. The conjunction &, when one of its operands is a noun, fixes an operand to a dyad:

m&v y has infinite rank and is equivalent to m v y; u&n y has infinite rank and is equivalent to y u n . Examples:

2&^ 0 1 2 3 1 2 4 8

(-&2) 4 5 6 2 3 4

Now we can solve our original problem, which was to put 1.04 * x + y into the form x v y . v should be

1.04&* @: +

which we can verify using fndisplay as

85

defverbs

'plus"0

times"0'

defnouns

'x y'

 

x 1.04&times @: plus y

+-------------------

 

+

|1.04 times

x plus y|

+-------------------

 

+

and to get my total savings after receiving all payments I use monad / to apply that verb for each payment, giving the expression:

1.04&* @: + / (|.x) , y

Let's take a moment to understand the parsing and execution of 1.04&* @: + / .

The left operand of a modifier includes all preceding words up to and including the nearest noun or verb that is not immediately preceded by a conjunction. This is a precise way of saying that modifiers associate left to right. In the phrase

1.04&* @: + /, the 1.04 is not preceded by a conjunction, so it is the beginning of all the conjunctions' left operands, and the verb is parsed as if it were written

(((1.04&*) @: +) / ) .

Note that left-to-right association of modifiers corresponds to right-to-left execution. When the derived verb monad (((1.04&*) @: +) / ) is executed, it performs according to the definition of monad u/, with ((1.04&*) @: +) as the u; execution of monad u/ inserts u between items, so ((1.04&*) @: +) is executed between items; at each such execution the dyad + is executed first, followed by the monad 1.04&* . Fortunately, the result of the parsing rules is that conjunctions and adverbs, just like verbs, should be read right-to-left.

If I wanted to spend half of my uncle's money , the amount I would be left with is

0.5 * 1.04&* @: + / (|.x) , y

No parentheses are needed, because 1.04 is still not preceded by a conjunction and so 1.04&* @: + / (|.x),y is still evaluated before that value is multiplied by

0.5 .

Once you get the hang of it, you will be able to understand and build composite verbs of great power. That will be a useful skill to develop, because you never know when you are going to want to make some sequence of functions the operand of a modifier, and then you're going to have to be able to express the sequence in a single compound verb. It will take a lot of practice, as well as coding techniques to break a gristly mass of conjunction-bound words into digestible pieces (we'll learn them later). For the time being, be content if you can understand the simple examples shown above.

86