>>  <<  Usr  Pri  JfC  LJ  Phr  Dic  Voc  !:  Help  J for C Programmers

                                                                          42. Explicit-To-Tacit Converter

Q: What's the most common cause of blindness among J programmers?

A: Conjunctivitis.

In the early weeks, complex tacit definitions are torturous to write and next-to-impossible to read; blurred vision and sleepless nights are the occupational hazard of the programmer who dives into tacit J.  If a co-worker is banging into doors as he stumbles to refill his tankard of coffee, here's how to check him out: hold up three fingers and ask him how many he sees.  If he says "three", he's merely fallen in love or is working to a deadline, and he will recover.  But if he replies "I see a list of 3 items each of which is a finger", you can expect to start receiving emails that look like they've been encrypted.

You can offer as a temporary palliative J's mechanism for converting an explicit verb-definition to a tacit one.  You request the conversion by using a left operand to : of 13  instead of 3 or .

   9!:3 (5)  NB. Do this once to select simplified display

   3 : 'x - y'

3 : 'x-y'

We defined a verb, and since we didn't assign it to anything, we see its value, which is just what we defined it to be.

   13 : 'x - y'

-

by using 13 instead of 3, we ask the interpreter to try to find a tacit equivalent,  which it did.

Here is another way to define the verb enclose from the previous chapter:

   13 : '(>{.x) , y , (>{:x)'

([: > [: {. [) , ] , [: > [: {: [

The interpreter likes to use [: in its tacit definitions.  Note that you use 13 : to get an equivalent for both monadic and dyadic verbs; there is no 14 : .

I recommend that you use 13 : as your first choice for defining tacit verbs.  It will find all tacit equivalents that can be generated systematically, and the explicit definition is much easier to read than a tacit definition.  You will still have to use your tacit-definition skills for irregular cases, such as

   13 : '+:^:x y'

4 : '+:^:x y'

If x or y is used as an operand to a conjunction, as in this example, the tacit converter is not going to be able to make a tacit equivalent.  The result of 13 : is still a verb performing the requested function, but it is an explicit definition rather than a tacit one.  Note that the interpreter saw that the definition contained a reference to x, so it made the verb a dyad.

   2 (13 : '+:^:x y') 3

12

This verb applies monad +: to y, x times.  Knowing about u^:v, you might find the tacit equivalent +:@]^:[ :

   2 (+:@]^:[) 3

12

Assignments in 13 : Tacit Definitions

The verb in 13 : must be only one line long, and tacit definitions cannot include assignments; but for a special form the interpreter will allow a use of assignment to give the effect of a multi-line verb.  An example is our old friend mean :

   13 : '(s % t) [ s =. +/ y [ t =. #y'

+/ % #

Clever, eh?  y [ t has the result y no matter what t is, so the interpreter recognizes the assignment to t as the creation of a temporary variable, and it substitutes the definition later in the expression when t is encountered.  You may have any number of assigments lined up like this.

Special Verb-Forms Used in Tacit Definitions

It is impossible for a tacitly-defined verb to route one of its operands to an operand of a modifier inside the verb.  For example, if we want a verb to set element x of y to 0, we can try

   13 : '0 x} y'

4 : '0 x}y'

but we see that the converter was unable to find a tacit form.

Some modifiers have exotic forms that circumvent this problem.  One such is the adverb } which supports the form x value`selector`operand} y .  This produces the same result as (x value y) (x selector y)} (x operand y) so we could write

   a =. 13 : 'x 0:`[`]} y'

   a

0:`[`]}

   3 a 9 7 5 3 1

9 7 5 0 1

Other such forms are x m&v y and x u&n y which are equivalent to m&v^:x y and u&n^:x y respectively.


>>  <<  Usr  Pri  JfC  LJ  Phr  Dic  Voc  !:  Help  J for C Programmers