| # Chapter 15: Tacit Operators ## 15.1 Introduction J provides a number of built-in operators - adverbs and conjunctions. In previous chapters we looked at defining our own operators explicitly. In this chapter we look at defining adverbs tacitly. ## 15.2 Adverbs from Conjunctions Recall from Chapter 07 the Rank conjunction, `(")`. For example, the verb `(< " 0)` applies Box `(<)` to each rank-0 (scalar) item of the argument.
       < " 0  'abc'
    +-+-+-+
    |a|b|c|
    +-+-+-+
A conjunction takes two arguments. If we supply only one, the result is an adverb. For example, an adverb to apply a given verb to each scalar can be written as `(" 0)`
`each =: " 0` | `< each` | `z =: < each 'abc'`
    "0
    <"0
    +-+-+-+
    |a|b|c|
    +-+-+-+
The scheme is, that for a conjunction `C` and a noun `N`, the expression `(C N)` denotes an adverb such that:
        x (C N)  means  x C N
The argument to be supplied to the conjunction can be a noun or a verb, and on the left or on the right. Altogether there are four similar schemes:
        x (C N)  means  x C N
        x (C V)  means  x C V
        x (N C)  means  N C x
        x (V C)  means  V C x
The sequences `CN CV NC` and `CV` are called "bidents". They are a form of bonding (or currying) whereby we take a two-argument function and fix the value of one of its arguments to get a one-argument function. However, there is a difference between bonding a dyadic verb (as in `+ & 2` for example) and bonding a conjunction. With the conjunction, there is no need for a bonding operator such as `&`. We just write `(" 0)` with no intervening operator. The reason is that in the case of `+ & 2`, omitting the `&` would give `+ 2` which means: apply the monadic case of `+` to 2, giving `2`. However, conjunctions don't have monadic cases, so the bident `(" 0)` is recognised as a bonding. Recall the "Under" conjunction `&.` from Chapter 08 whereby `f&.g` is a verb which applies `g` to its argument, then `f` then the inverse of `g`. If we take `f` and `g` to be:
       f =: 'f' & ,
       g =: >
then we see that `f` is applied inside each box:
`z` | `(f &. g) z`
    +-+-+-+
    |a|b|c|
    +-+-+-+
    +--+--+--+
    |fa|fb|fc|
    +--+--+--+
Now, using the form `CV`, we can define an adverb `EACH` to mean "inside each box":
`EACH =: &. >` | `f EACH` | `z` | `f EACH z`
    &.>
    f&.>
    +-+-+-+
    |a|b|c|
    +-+-+-+
    +--+--+--+
    |fa|fb|fc|
    +--+--+--+
## 15.3 Compositions of Adverbs If `A` and `B` are adverbs, then the bident `(A B)` denotes an adverb which applies `A` and then `B`. The scheme is:
         x (A B)   means (x  A) B
### 15.3.1 Example: Cumulative Sums and Products There is a built-in adverb `\` (backslash). In the expression `f \ y` the verb `f` is applied to successively longer leading segments of `y`. For example:
       < \ 'abc'
    +-+--+---+
    |a|ab|abc|
    +-+--+---+
The expression `+/ \ y` produces cumulative sums of `y`:
       +/ \ 1 2 3
    1 3 6
An adverb to produce cumulative sums, products, and so on can be written as a bident of two adverbs:
       cum =: / \   NB. adverb adverb
`z =: 2 3 4` | `+ cum z` | `* cum z`
    2 3 4
    2 5 9
    2 6 24
### 15.3.2 Generating Trains Now we look at defining adverbs to generate trains of verbs, that is, hooks or forks. First recall from Chapter 14 the Tie conjunction (```), which makes gerunds, and the Evoke Gerund adverb (``: 6`) which makes trains from gerunds. Now suppose that `A` and `B` are the adverbs:
       A =: * `    NB. verb conjunction
       B =: `: 6   NB. conjunction noun
Then the compound adverb
       H =: A B
is a hook-maker. Thus `<: H` generates the hook `* <:` , that is "x times x-1"
`<: A` | `<: A B` | `h =: <: H` | `h 5`
    +-+--+
    |*|<:|
    +-+--+
    * <:
    * <:
    20
### 15.3.3 Rewriting It is possible to rewrite the definition of a verb to an equivalent form, by rearranging its terms. Suppose we start with a definition of the factorial function `f`. Factorial 5 is 120.
       f =: (* ($: @: <:)) ` 1:  @. (= 0:)
       f 5
    120
The idea now is to rewrite `f` to the form `$: adverb`, by a sequence of steps. Each step introduces a new adverb. The first new adverb is `A1`, which has the form `conj verb`.
       A1 =: @. (= 0:)
       g  =: (* ($: @: <:)) ` 1: A1
       g 5
    120
Adverb `A2` has the form `conj verb`
       A2 =: ` 1:
       h  =: (* ($: @: <:)) A2 A1
       h 5
    120
Adverb `A3` has the form `adv adv`
       A3 =: (* `) (`: 6)
       i  =: ($: @: <:) A3 A2 A1
       i 5
    120
Adverb `A4` has the form `conj verb`
       A4=: @: <:
       j  =: $: A4 A3 A2 A1
       j 5
    120
Combining `A1` to `A4`:
       A =: A4 A3 A2 A1
       k =: $:  A
       k 5
    120
Expanding `A`:
       m =: $: (@: <:) (* `) (`: 6) (` 1:) (@. (= 0:))
       m 5
    120
We see that `m` and `f` are the same verb:
`f` | `m`
    (* $:@:<:)`1:@.(= 0:)
    (* $:@:<:)`1:@.(= 0:)
This is the end of Chapter 15.

NEXT
Table of Contents

Copyright © Roger Stokes 2002. This material may be freely reproduced, provided that this copyright notice is also reproduced.

last updated 11 Aug 2002