Help / JforC / Explicit-To-Tacit Converter
>> << Pri JfC LJ Phr Dic Voc !: Rel NuVoc wd 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 4 .
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.
>> << Pri JfC LJ Phr Dic Voc !: Rel NuVoc wd Help J for C Programmers