• There is more than one way to scan a kit.

Referred to as data amalgamation [1], these operations apply a verb to consecutive subsets of the argument.

This is a follow up on some ideas about scanning and order visualization by Jose Mario Quintana programming/2006-December/004368.

## Overview

We are going to use verb c for concatenation (append) with parentheses to see order of application.

```   c=. '(' , [ , ')' ,~ ]
'a' c 'b' c 'c'
(a(bc))```

This immediately demonstrates the order of execution in J.

## Insert

Adverb insert is called reduce in APL [2].

Here are basic transformations to affect the order of execution and the position of the arguments: passive and reverse.

```   c/ 'abcde'       c~/ 'abcde'       c/@|. 'abcde'        c~/@|. 'abcde'
(a(b(c(de))))    ((((ed)c)b)a)     (e(d(c(ba))))        ((((ab)c)d)e)```

## Prefix

Accummulating results of insert is done with additional adverb prefix applied to insert to produce the effect of APL scan [3].

```   c/\ 'abcde'      c~/\ 'abcde'      c/\&.|. 'abcde'      c~/\&.|. 'abcde'
a                a                 (e(d(c(ba))))        ((((ab)c)d)e)
(ab)             (ba)              (e(d(cb)))           (((bc)d)e)
(a(bc))          ((cb)a)           (e(dc))              ((cd)e)
(a(b(cd)))       (((dc)b)a)        (ed)                 (de)
(a(b(c(de))))    ((((ed)c)b)a)     e                    e```

## Suffix

In J, it is also possible to scan backwards with adverb suffix. Note how the results are nested or reusable.

```   c/\. 'abcde'     c~/\. 'abcde'     c/\.&.|. 'abcde'     c~/\.&.|. 'abcde'
(a(b(c(de))))    ((((ed)c)b)a)     a                    a
(b(c(de)))       (((ed)c)b)        (ba)                 (ab)
(c(de))          ((ed)c)           (c(ba))              ((ab)c)
(de)             (ed)              (d(c(ba)))           (((ab)c)d)
e                e                 (e(d(c(ba))))        ((((ab)c)d)e)```

## Infix

Another way to traverse a list if infix.

```   2 c/\ 'abcde'    2 c~/\ 'abcde'    2 c/\|. 'abcde'      2 c~/\|. 'abcde'
(ab)             (ba)              (ed)                 (de)
(bc)             (cb)              (dc)                 (cd)
(cd)             (dc)              (cb)                 (bc)
(de)             (ed)              (ba)                 (ab)```

## Non-overlapping Infix

A negative window parameter applies to non-overlapping (disjoint) subsets.

```   _2 c/\ 'abcdef'
(ab)
(cd)
(ef)```

Further reduction on this result combines the pairs, grouping from bottom to top:

```   c/_2 c/\ 'abcdef'
((ab)((cd)(ef)))```

## References

1. C. Burke, C. Reiter. A Brief J Reference. 2002, 2004.

2. C. Burke. Operators - Reduce, Scan, Outer Product. In APL and J, Vector, Vol 13 No 3, January 1997.

3. C. Burke, R. Hui, J for the APL Programmer. APL Quote-Quad, Volume 27, Number 1, September 1996.

Contributed by OlegKobchenko with additions by DevonMcCormick.

OlegKobchenko/Ways to Scan (last edited 2009-12-28 04:49:16 by OlegKobchenko)