##.esh digits                               ⍝ Shell for Eide-number sums.

[esh] is an interactive shell for Eide-number sums (see →ratrep←).  [esh] inter-
prets  each line of ⍞-input as a vector of numbers in the current base and disp-
lays its sum by using →ratsum← reduction. This input-eval-display loop continues
until a terminating ')' is input.

The  right  argument  provides the [digits] for the initial number base (radix).
The digits, and therefore the base, may subsequently be changed by an input line
of the form {···0···}.

To start in decimal, we could call [esh] so:

    esh ⎕D      ⍝ start in decimal.

In  addition to the formal syntax of numbers required by →ratsum←, [esh] accepts
and displays numbers in a more informal style, using these five substitutions:

                   nnn.fff  ←→  <0|nnn.fff|0>       ⍝ plain num → enum.

                  ¯nnn.fff  ←→  comp'<0|nnn.fff|0>' ⍝ negative num → complement.

            ..lrulrunnn.fff ←→  <lru|nnn.fff|0>     ⍝ .. precedes repeated lru.

            nnn.fffrrurru.. ←→ <0|nnn.fff|rru>      ⍝ .. follows repeated rru.

    ..lrulrunnn.fffrrurru.. ←→ {lru|nnn.fff|rru}    ⍝ combination of the above.

The  "double-dot" digraph is a notational device, which captures its longest ad-
jacent twice-repeated string for the appropriate replication unit (RU).

For example:

            123.45  ←→  <0|123.45|0>        ⍝ Simple number.
           ¯123.45  ←→  <9|876.55|0>        ⍝ Explicit negative sign absorbed.
        ..12123.45  ←→  <12|3.45|0>         ⍝ Non-zero LRU.
        123.4545..  ←→  <0|123|45>          ⍝ Non-zero RRU.
   ..121234.5656..  ←→  <12|34|56>          ⍝ Both RUs non-zero.

Notice  that, with a number such as "0.233766233766..", it is the _whole_ of the
"233766" that is repeated indefinitely (not just the "6" on the end). When read-
ing such numbers, we must learn to spot the _longest_ twice-repeated sequence.

Informally, .. means "the adjacent sequence repeated indefinitely". For example,
one third may be represented in decimal thus:

    0.33..      ⍝ decimal one-third.

NB: Double-dots do not confer any vagueness of value.  Such numbers have perfect
accuracy (unlike the beguiling decimal "0.1" in your PC's spreadsheet).

For example, the interaction:

        4.99..      ⍝ display number.
    5

does not constitute a rounding; "5" and "4.99.." are alternative representations
of the _same_ decimal number; it's just that esh's (actually →ratsum←'s) display
code favours the shorter form.

This may come as a bit of a surprise:

        ..999
    ¯1
        ..998
    ¯2

although, after a moment's reflection, it seems reasonable that adding 1 to ..99
would cause carried "1"s to ripple ever leftwards, leaving ..00.  An alternative
way  to come to terms with this might be to imagine a brand new odometer with an
unspecified number of digit positions: [..00]. What would we expect to happen if
we wound the odometer backwards by one click?

Formal syntax:                                                   Examples
                                                                 ¯¯¯¯¯¯¯¯
    num :=            seq                   ⍝ whole number       03102405
         |  .. seqseq seq                   ⍝   non-zero LRU     ..121234
         |            seq . seq             ⍝ fractional number       123.456
         |            seq . seq seqseq ..   ⍝   non-zero RRU          123.455..
         |  .. seqseq seq . seq seqseq ..   ⍝   non-zero RUs       ..1123.4566..
    where:
        seq is a seqence of digits drawn from the current base {digs}.  012
        seqseq is a twice-repeated sequence.                            012012

Examples:

      esh ⎕d                    ⍝ start in decimal.

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Decimal

    1 2 3 4                     ⍝ sum some nums.
10
    4.99..                      ⍝ normalised display.
5
    0.142857142857..  0.0909..  ⍝ 1/7 + 1/11 → 18/77
0.233766233766..

    5 ¯12 ¯4.5                  ⍝ APL has a nice "neg" sign.
¯11.5

    <12|3|45>                   ⍝ esh accepts formal input.
2.2424..

    ⍝ Note the subtle differences in these four examples:

    2.33   5.66
7.99

    2.33.. 5.66
7.9933..

    2.33   5.66..
7.9966..

    2.33.. 5.66..
8

    ..0042.00..                 ⍝ double dots on left.
42

    ..11                        ⍝ <1|1|0>  (see →ratrep←).
¯0.11..

    0.1234..                    ⍝ error (no repeated string to left of "..").
bad number

⍝ Perhaps the following sequence will make you pause before
⍝ dismissing Euler's preposterous claim (see →ratrep←).

    ..99                            ⍝ (see note above)
¯1
    0.99..                          ⍝ (see note above)
1
    ..99  0.99..                    ⍝ ¯1 + 1 → 0
0
    ..99.99..                       ⍝   ..  ..
0
    ..33.33.. ..33.33.. ..33..33..  ⍝ 3 × ..33.33.. → ..99.99.. → 0
0
    ..33.33..                       ⍝ 0=3×⍵ implies ⍵=0
0
    ..11.11.. ..11.11.. ..11.11..   ⍝ 3 × ..11.11.. → ..33.33.. → 0
0
    ..11.11..                       ⍝ 0=3×⍵ implies ⍵=0
0
    ..0101.0101..                   ⍝ the sum of 11 of these gives ..1111.1111..
0
    ..001001.001001..               ⍝ the sum of 111 of these gives     ..
0
    ..123123.123123..               ⍝ 0=123×⍵ implies ⍵=0
0

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Balanced Ternary

    {-0+}               ⍝ change base to balanced ternary.   See also →bt←

    +--+  +-+-          ⍝ balanced ternary: 16 + 20 → 36
++00

    + + + + +           ⍝ balanced ternary 5.
+--

    0.++..  +.--..      ⍝ two representations of one-half.
+
    ..--                ⍝ ... and a third, perhaps less obvious, one.
0.++..

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Hexadecimal

    {0123456789abcdef}          ⍝ change base to hexadecimal.

    3e8 7d0 bb8 fa0             ⍝ sum of four hex numbers.
2710

    3e8 ¯200                    ⍝ sum with explicit negative sign.
1e8

    ffffffff 000003e8           ⍝ ffffffff is ¯1+2*32
1000003e7

    ..ffffff 000003e8           ⍝ ..ffffff is ¯1
3e7

    19d9c ¯dead
beef

    ¯baad ¯3560
¯f00d

    ..ffe
¯2

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Pos-skewed four

    {-0+#}          ⍝ change base to pos-skewed four (# is double-plus).

    # # # # # +     ⍝ 11        (2+2+2+2+2+1) → (4⊥1 ¯1 ¯1)
+--

    0.#  0.#        ⍝ one-half plus one-half
+

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Neg-skewed four

    {=-0+}          ⍝ change base to neg-skewed four (= is double-minus).

    + + + + + +     ⍝ 6         (1+1+1+1+1+1) → (4⊥1 ¯2 ¯2)
+==

    +.=  +.=        ⍝ one-half plus one-half
+

    )   ⍝ quit.

See also: ratsum ratrep bt repl

Back to: contents

Back to: Workspaces