If ag generates indices for a gerund ger, we will call ag an agenda function, and the function [email protected] a case statement. For example: |
ger=: f`g`h ag=: #@$ case=: [email protected] f=: -: [. g=: +: [. h=: *: (case 3);(case 2 3 4 5);(case i.3 4) +--------------------------+ ¦1.5¦4 6 8 10¦ 0 1 4 9¦ ¦ ¦ ¦16 25 36 49¦ ¦ ¦ ¦64 81 100 121¦ +--------------------------+ f=: *: (case 3);(case 2 3 4 5);(case i.3 4) +------------------------+ ¦9¦4 6 8 10¦ 0 1 4 9¦ ¦ ¦ ¦16 25 36 49¦ ¦ ¦ ¦64 81 100 121¦ +------------------------+
Certain agendas prove to be useful with a variety of gerunds: for example, the rank used above, as well as various classifications such as negative, zero, and positive; integral or fractional; real or complex; numeric or character; boxed or open; and the depth of boxing. Since indices may be negative, the result of an agenda may be negative; thus the case f`g`h@.* applies f if the argument is zero, g if it is positive, and h if it is negative. Since an agenda such as the hook =<. (which tests for fractional or integral) might invoke a domain error (when the argument is character or boxed), it is often useful to extend an agenda to produce a result in such a case. If this result is _1, the corresponding function in the gerund (perhaps h=: 'ERROR'"_) may be simply appended to the normal cases. Thus, the test for integral may be defined (using adverse) as (=<.) :: _1: For example: |
F=: (=<.) :: _1: F"0 x=: 0.5 _2 2 0 1 1 F 'abcd' _1
An "or" over an agenda (that is, applying a given function for any one of several cases distinguished by the agenda) can be achieved by placing the same function in several places in the gerund . Moreover, agendas may be used in combination, as illustrated below: |
c=: co`[email protected] Executes co if open; cb if boxed co=: -@|`[email protected] Minus magnitude if real; conjugate cb=: ]`(|.&.>)`(|:&.>)@.(R@>) Reverse if opened is list; transpose c <i. 2 4 if opened is a table cb <i.2 4 The case chosen by the agenda B +---+ ¦0 4¦ ¦1 5¦ ¦2 6¦ ¦3 7¦ +---+ c 3j4 5 6j7 (Open) complex argument 3j_4 5 6j_7 Conjugate co 3j4 5 6j7 The case chosen by the agenda B 3j_4 5 6j_7
The complete definition of c can be seen by fixing it: |
c f. -@|`+@.(-.@(-: +) ::(_1:))`(]`(|.&.>)`(|:&.>)@.(#@$@>))@.(-.@(-: >) ::0:)