Debugging --------- Reduction sequences may be traced by replacing the "=" equivalence with a "≡", which displays reductions in the session as they occur. Infix function "≡" must occur as a function ≡() in the source vector, in the usual fashion. Traced output is in the form: ·····before [fm → to] after └─┬─┘└─┬──┘ └───┬───┘ └─┬─┘ │ │ │ └── sub-expression after reduction │ │ └────────── reduction rule employed │ └─────────────────── sub-expression before reduction └──────────────────────── indication of depth of sub-expression For example, taking signed binary arithmetic: load sba eval'1.0.1.0.0/1.1' ⍝ 20÷3 → 6 1.1.0 Replace each "=" in the "long division" stanza in sba with a "≡": ┌──────────────────────────────────────────────────────────────────────────────┐ │⍝ "long division" algorithm. See: notes.Long_division │ │ │ │ A1; p; q; r.i; s.j ≡ A1; p; q; r; s ⍝ A: left align divisor │ │ A1; p; q; r ; j ≡ A2; p; q; |; r ⍝ reset shift mechanism │ │ A1; p; q; i; s ≡ A2; p; q; |; i │ │ │ │ A2; p; q; s; r.i ≡ A2; p; q.0; s.<; r ⍝ shift divisor & count │ │ A2; p; q; s; i ≡ B1; p; q; s; 0 ⍝ s-shifted divisor q │ │ │ │ B1; p; q; s; r ≡ B2; p; q; s; r; p-q ⍝ subtract │ │ │ │ B2; p; q.j; s.<; r; -t ≡ B1; p; q; s; r.0 ⍝ shift right & repeat │ │ B2; p; q.j; s.<; r; t ≡ B1; t; q; s; r.1 │ │ B2; p; q; |; r; -t ≡ r.0; p ⍝ finished │ │ B2; p; q; |; r; t ≡ r.1; t │ └──────────────────────────────────────────────────────────────────────────────┘ load sba ⍝ reload of revised sba eval'1.0.1.0.0/1.1' ⍝ 20÷3 → 6 ··A1;1.0.1.0.0;1.1;1.0.1.0.0;1.1 [A1;p;q;r.i;s.j → A1;p;q;r;s] A1;1.0.1.0.0;1.1;1.0.1.0;1 ··A1;1.0.1.0.0;1.1;1.0.1.0;1 [A1;p;q;r;j → A2;p;q;|;r] A2;1.0.1.0.0;1.1;|;1.0.1.0 ··A2;1.0.1.0.0;1.1;|;1.0.1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0;|.<;1.0.1 ··A2;1.0.1.0.0;1.1.0;|.<;1.0.1 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0 ··A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1 ··A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1 [A2;p;q;s;i → B1;p;q;s;0] B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0 ··B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;1.0.1.0.0-1.1.0.0.0 ··B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;-1.1.1.0.0 [B2;p;q.j;s.<;r;-t → B1;p;q;s;r.0] B1;1.0.1.0.0;1.1.0.0;|.<.<;0.0 ··B1;1.0.1.0.0;1.1.0.0;|.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.1.0.0-1.1.0.0 ··B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.0.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0.0.0;1.1.0;|.<;0.1 ··B1;1.0.0.0;1.1.0;|.<;1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.0.0;1.1.0;|.<;1;1.0.0.0-1.1.0 ··B2;1.0.0.0;1.1.0;|.<;1;1.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0;1.1;|;1.1 ··B1;1.0;1.1;|;1.1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0;1.1;|;1.1;1.0-1.1 ··B2;1.0;1.1;|;1.1;-1.1 [B2;p;q;|;r;-t → r.0;p] 1.1.0;1.0 1.1.0 ⍝ Dyadic operator [trace] temporarily replaces all occurrences of '=' with '≡' ⍝ throughout the whole of the script, thus providing a complete trace: sba trace eval'1.0.1.0.0/1.1' ⍝ 20÷3 → 6 ·1.0.1.0.0/1.1 [p/q → div(A1;p;q;p;q)] div(A1;1.0.1.0.0;1.1;1.0.1.0.0;1.1) ··A1;1.0.1.0.0;1.1;1.0.1.0.0;1.1 [A1;p;q;r.i;s.j → A1;p;q;r;s] A1;1.0.1.0.0;1.1;1.0.1.0;1 ··A1;1.0.1.0.0;1.1;1.0.1.0;1 [A1;p;q;r;j → A2;p;q;|;r] A2;1.0.1.0.0;1.1;|;1.0.1.0 ··A2;1.0.1.0.0;1.1;|;1.0.1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0;|.<;1.0.1 ··A2;1.0.1.0.0;1.1.0;|.<;1.0.1 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0 ··A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1 ··A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1 [A2;p;q;s;i → B1;p;q;s;0] B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0 ··B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;1.0.1.0.0-1.1.0.0.0 ···1.0.1.0.0-1.1.0.0.0 [p.i-q.j → (p-q).(i-j)] (1.0.1.0-1.1.0.0).(0-0) ····1.0.1.0-1.1.0.0 [p.i-q.j → (p-q).(i-j)] (1.0.1-1.1.0).(0-0) ·····1.0.1-1.1.0 [p.i-q.j → (p-q).(i-j)] (1.0-1.1).(1-0) ······1.0-1.1 [p.i-q.j → (p-q).(i-j)] (1-1).(0-1) ·······1-1 [p-p → 0] 0 ·······0-1 [0-q → -q] -1 ······0.-1 [p.-j → (p-1).j] (0-1).1 ·······0-1 [0-q → -q] -1 ······(-1).1 [(-p).j → -p.j] -1.1 ······1-0 [p-0 → p] 1 ·····(-1.1).1 [(-p).j → -p.j] -1.1.1 ·····0-0 [p-0 → p] 0 ····(-1.1.1).0 [(-p).j → -p.j] -1.1.1.0 ····0-0 [p-0 → p] 0 ···(-1.1.1.0).0 [(-p).j → -p.j] -1.1.1.0.0 ··B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;-1.1.1.0.0 [B2;p;q.j;s.<;r;-t → B1;p;q;s;r.0] B1;1.0.1.0.0;1.1.0.0;|.<.<;0.0 ···0.0 [0.j → j] 0 ··B1;1.0.1.0.0;1.1.0.0;|.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.1.0.0-1.1.0.0 ···1.0.1.0.0-1.1.0.0 [p.i-q.j → (p-q).(i-j)] (1.0.1.0-1.1.0).(0-0) ····1.0.1.0-1.1.0 [p.i-q.j → (p-q).(i-j)] (1.0.1-1.1).(0-0) ·····1.0.1-1.1 [p.i-q.j → (p-q).(i-j)] (1.0-1).(1-1) ······1.0-1 [p.i-j → p.(i-j)] 1.(0-1) ·······0-1 [0-q → -q] -1 ······1.-1 [p.-j → (p-1).j] (1-1).1 ·······1-1 [p-p → 0] 0 ······0.1 [0.j → j] 1 ······1-1 [p-p → 0] 0 ·····0-0 [p-0 → p] 0 ····0-0 [p-0 → p] 0 ··B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.0.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0.0.0;1.1.0;|.<;0.1 ···0.1 [0.j → j] 1 ··B1;1.0.0.0;1.1.0;|.<;1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.0.0;1.1.0;|.<;1;1.0.0.0-1.1.0 ···1.0.0.0-1.1.0 [p.i-q.j → (p-q).(i-j)] (1.0.0-1.1).(0-0) ····1.0.0-1.1 [p.i-q.j → (p-q).(i-j)] (1.0-1).(0-1) ·····1.0-1 [p.i-j → p.(i-j)] 1.(0-1) ······0-1 [0-q → -q] -1 ·····1.-1 [p.-j → (p-1).j] (1-1).1 ······1-1 [p-p → 0] 0 ·····0.1 [0.j → j] 1 ·····0-1 [0-q → -q] -1 ····1.-1 [p.-j → (p-1).j] (1-1).1 ·····1-1 [p-p → 0] 0 ····0.1 [0.j → j] 1 ····0-0 [p-0 → p] 0 ··B2;1.0.0.0;1.1.0;|.<;1;1.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0;1.1;|;1.1 ··B1;1.0;1.1;|;1.1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0;1.1;|;1.1;1.0-1.1 ···1.0-1.1 [p.i-q.j → (p-q).(i-j)] (1-1).(0-1) ····1-1 [p-p → 0] 0 ····0-1 [0-q → -q] -1 ···0.-1 [p.-j → (p-1).j] (0-1).1 ····0-1 [0-q → -q] -1 ···(-1).1 [(-p).j → -p.j] -1.1 ··B2;1.0;1.1;|;1.1;-1.1 [B2;p;q;|;r;-t → r.0;p] 1.1.0;1.0 ·div(1.1.0;1.0) [div(q;r) → q] 1.1.0 1.1.0 bta trace until ')' ⍝ balanced ternary tracing: 1.1.1.1.1 + 1 ⍝ sum with carry ·1.1.1.1.1+1 [p.i+j → p.(i+j)] 1.1.1.1.(1+1) ··1+1 [i+i → i.-i] 1.-1 ···-1 [-1 → ¯1] ¯1 ·1.1.1.1.(1.¯1) [p.(i.j) → (p+i).j] (1.1.1.1+1).¯1 ··1.1.1.1+1 [p.i+j → p.(i+j)] 1.1.1.(1+1) ···1+1 [i+i → i.-i] 1.-1 ····-1 [-1 → ¯1] ¯1 ··1.1.1.(1.¯1) [p.(i.j) → (p+i).j] (1.1.1+1).¯1 ···1.1.1+1 [p.i+j → p.(i+j)] 1.1.(1+1) ····1+1 [i+i → i.-i] 1.-1 ·····-1 [-1 → ¯1] ¯1 ···1.1.(1.¯1) [p.(i.j) → (p+i).j] (1.1+1).¯1 ····1.1+1 [p.i+j → p.(i+j)] 1.(1+1) ·····1+1 [i+i → i.-i] 1.-1 ······-1 [-1 → ¯1] ¯1 ····1.(1.¯1) [p.(i.j) → (p+i).j] (1+1).¯1 ·····1+1 [i+i → i.-i] 1.-1 ······-1 [-1 → ¯1] ¯1 1.¯1.¯1.¯1.¯1.¯1 -1.1.1.1.1.1.1.1 ⍝ negation ·-1.1.1.1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1.1.1.1).-1 ··-1.1.1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1.1.1).-1 ···-1.1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1.1).-1 ····-1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1).-1 ·····-1.1.1.1 [-p.i → (-p).-i] (-1.1.1).-1 ······-1.1.1 [-p.i → (-p).-i] (-1.1).-1 ·······-1.1 [-p.i → (-p).-i] (-1).-1 ········-1 [-1 → ¯1] ¯1 ········-1 [-1 → ¯1] ¯1 ·······-1 [-1 → ¯1] ¯1 ······-1 [-1 → ¯1] ¯1 ·····-1 [-1 → ¯1] ¯1 ····-1 [-1 → ¯1] ¯1 ···-1 [-1 → ¯1] ¯1 ··-1 [-1 → ¯1] ¯1 ¯1.¯1.¯1.¯1.¯1.¯1.¯1.¯1 ) Back to: →Contents←