⍝ ARUN source code by Wiley Greiner. APL source code, 14 June 1974. ⍝ Implementation of APL operators not implemented in microcode. ⍝ Transcribed by Academia.edu Co-scientist and hand-checked by Paul McJones, October 2026. ⍝ Original: https://crms-apl.computerhistory.org/19740614-wg-arun_source.pdf ⍝ PDF page 2 ∇ ⎕WIDTH (//) ⎕DIGITS : ∇ ∇ ⎕IO_BOXES ← (ϵ) GLOBAL: ∇ ∇ (→) A : ⊃ 204 ∇ ∇ A ← NOP B : ⊃ 210 ∇ ∇ ATTN A : ⊃ 212 ∇ ∇ αA αATN αB : ⊃ 212 ∇ ∇ (↓) A : ∇ ∇ A ← (↑): ∇ ∇ OUTCHARSC A : ⊃ 212 ∇ ∇ A ← INCHARSC : ⊃ 211 ∇ ∇ RETURN : ⊃ 208 ∇ ∇ X ← A (←) B : ⊃ 112 ∇ ∇ αA αASNO αB: ⊃ 113 ∇ ∇ X ← (+) A : ⊃ 128 ∇ ∇ X ← (-) A : ⊃ 129 ∇ ∇ X ← (⌊) A : ⊃ 130 ∇ ∇ X ← (⌈) A : ⊃ 131 ∇ ∇ X ← (|) A : ⊃ 132 ∇ ∇ X ← (~) A: ⊃ 133 ∇ ∇ X ← (∪) : ⊃ 192 ∇ ∇ (//) A: ⊃ 193 ∇ ∇ X ← A INTCH B : ⊃ 194 ∇ ∇ X ← A TYPECONV B : ⊃ 143 ∇ ∇ X ← (⊥) A : ¯1 INTCH TYPECONV ∇ ∇ X ← (⊤) A : 0 INTCH TYPECONV ∇ ∇ X ← A COEFBEXP B : ⊃ 134 ∇ ∇ X ← COEF B : ¯1 INTCH COEFBEXP ∇ ∇ X ← BEXP A : 0 INTCH COEFBEXP ∇ ∇ X ← (⍴) A : ⊃ 197 ∇ ∇ X ← A (⍴) B : ⊃ 198 ∇ ∇ X ← (,) A : ⊃ 199 ∇ ∇ X ← A COMAαINST B : ⊃ 200 ∇ ∇ X ← (⍳)A : ⊃ 201 ∇ ∇ X ← A (=) B , 1 : ⊃ 142 ∇ ∇ X ← A (≠) B , 2 : = ~: ∇ ∇ X ← A (+) B , 3 : ⊃ 135 ∇ ∇ X ← A (-) B , 4 : ⊃ 136 ∇ ∇ X ← A (×) B , 5 : ⊃ 137 ∇ ∇ X ← A (÷) B , 6 : ⊃ 138 ∇ ∇ X ← αA (|) αB , 9 : αASNO αA αASNO αB 0 αA = αA + αB ÷ ⌊: αA × αB - ∪: ← αA αASNO αB ∇ ∇ X ← A (<) B , 14 : ⊃ 141 ∇ ∇ X ← A (≤) B , 15 : INTCH < ~: ∇ ∇ X ← A (≥) B , 16 : < ~: ∇ ∇ X ← A (>) B , 17 : INTCH < ∇ ∇ X ← A (∨) B , 18 : ⊃ 140 ∇ ∇ X ← A (∧) B , 19 : ⊃ 139 ∇ ∇ X ← A NOR B , 20 : ∨ ~: ∇ ∇ X ← A NAND B , 21 : ∧ ~: ∇ ∇ X ← (÷) A : 1.0 ÷ ∇ ∇ X ← (×) αA : ← αA 0 INTCH < αA 0 < - ∪: αASNO αA ∇ ∇ X ← PI : 3.14159265389793 ∇ ⍝ PDF page 3 ∇ X ← (○) A : PI: × ∇ ∇ X ← MINNUMBER : ⊃ 202 ⊃ 255 ⊃ 255 ⊃ 255 ⊃ 255 ∇ ∇ X ← MAXNUMBER : ⊃ 202 ⊃ 127 ⊃ 255 ⊃ 255 ⊃ 255 ∇ ∇ X ← αA (⌈) αB , 7 : αASNO αA ← αB αA - αA αB < × αB + ∪: ← αA αASNO αB ∇ ∇ X ← αA (⌊) αB , 8 : αASNO αA ← αB αA - αB αA < × αB + ∪: ← αA αASNO αB ∇ ∇ X ← A IF B : INTCH ⍴ ∇ ∇ X ← A UL B : INTCH ~: ⍴ ∇ ∇ X ← A UNLESS B : UL ∇ ∇ A ← ANDREDUCE B : 1 INTCH ⍴ ,: ⍴: ∇ ∇ A ← CRLF: 106 109 COMAαINST ⊤: ∇ ∇ ⎕DE_PROC αA : ← αA 2 αATN ∪: αASNO αA ∇ ∇ αB ← ⎕CR_BOX αA: ← αA 3 αATN ∪: αASNO αA ∇ ∇ ⎕DE_BOX αA: ← αA 4 αATN ∪: αASNO αA ∇ ∇ ⎕CR_FILE αA: ← αA 5 αATN ∪: αASNO αA ∇ ∇ ⎕DE_FILE αA: ← αA 6 αATN ∪: αASNO αA ∇ ∇ αB ⎕SEND αA: αASNO αB ← αA αB 10 αATN ∪: ← αA αASNO αB ∇ ∇ αB ⎕DELIVER αA: αASNO αB ← αA αB 11 αATN ∪: ← αA αASNO αB ∇ ∇ ⎕DETACH αB : ← αB 13 αATN ∪: αASNO αB ∇ ∇ ⎕RW_FILE αA: ← αA 14 αATN ∪: αASNO αA ∇ ⍝ PDF page 4 ∇ A ← REDUCE[SWITCH;DIM] SRC;RHOS;RANK;INCR;I;I2;TARGET;LEN;N → VECTORSCAL IF (RANK←'' ⍴ ⍴ RHOS← ⍴ SRC) < 2 → DEFINEDIM+ϵDIM ⍝ SKIP NEXT LINE IFF DIM ALREADY SPECIFIED. DEFINEDIM: DIM←RANK ⍝ NEXT LINE YIELDS ERROR IF ⍴,DIM ISN'T 1. LEN←RHOS[I←DIM←(⍳ DIM ∨ ⍝ ∧ NOR NAND ∇ ⍝ PDF page 9 ∇ A ← RHOA IDELEM I I ← 1 ∨ 1+2=A←(1 0 0 0 1 1,MINNUMBER,MAXNUMBER,0 1 2 2 1 0 1 1 0 0 1 2 2)[I] ⍝ THIS FUNCTION COMPUTES THE IDENTITY ELEMENT FOR THE ITH PRIMITIVE ⍝ FUNCTION. P-FNS WITH NO SUCH ELEMENT, SUCH AS NAND, INVOKE A ⍝ DOMAIN ERROR. A ← RHOA ⍴ A ∇ ⍝ PDF page 10 ∇ A ← B (∊) C →OR_IT+0=A←'' ⍴ ⍴ C←,C // ↓(⍴B)⍴0 OR_IT: →OR_IT+0=A←A-1 // ↓(B=C[A]) ∨ ↑ A←↑ ∇ ⍝ PDF page 11 ∇ A ← B (⍳) C;D;E;I;J → 6 IF (⍴ A←,C)=J←0 // E←'' ⍴ ⍴ B←B,0 // D← ⍴ C C ← B = B[E]←A[J←J+~ I←0] ⍝C[E] IS FORCED TO BE ONE → 3+C[I←I+1] ⍝C[I] IS ALWAYS ONE ∨ ZERO A[J]←I ⍝C[I] WAS ONE → 2 IF J < ⍴ A A←D ⍴ A ⍝ERROR UNLESS 1 GE ⍴ ⍴ B ⍝360 ENHANCEMENT: B MAY BE A SCALAR, IF SO, TREATED LIKE A VECTOR ∇ ⍝ PDF page 12 ∇ A ← ROTATE[○DIM] SRC;I;I2;INCR;LEN;N;RANK;RHOS;START → VECTORSCAL IF (RANK←'' ⍴ ⍴ RHOS← ⍴ SRC)<2 → DEFINEDIM+ϵDIM DEFINEDIM: DIM←RANK LEN←RHOS[I←DIM←(⍳DIM 2, OR ⍝ IF LEFT ARGUMENT HAS AN INVALID RANK. ∇ ⍝ PDF page 16 ∇ A ← UPGRADE VECT;I;INDEX;REMEMBER;RHOV;V;VAL → 0 IF 0=RHOV←(,INDEX = 0 0 ⍴ I←0) ⍴ INDEX← ⍴ A←VECT SEARCH: INDEX←0 ⍝ REMEMBER ← SMALLEST INDEX OF THE SMALLEST NUMBER ENCOUNTERED. → REMEM - 'M' = VECT[INDEX←INDEX+1] REMEM: VAL←VECT[REMEMBER←INDEX] CHECK: → (INDEX = RHOV) ⍴ THRU → ('M'=V←VECT[INDEX←INDEX+1]) ⍴ CHECK → CHECK - V < VAL THRU: VECT[A[I←I+1]←REMEMBER]←'M' → SEARCH IF I0) ∧ 2-ANDREDUCE(⍳I←⌈/A)∊A ⍝CHECK DOMAIN INITΔW1: W1[J←J-1]←W1[J]×RB[J] →INITΔW1 IF 1⌊ A) ∧ 0 ',T106 ⎕IO_BOXES[1] ⎕SETCONV 1 A←⎕RECEIVE αA←⎕IO_BOXES[1] →NOGOOD IF 0=⍴A←(⊥A)/A ∇ ⍝ PDF page 35 ∇ B αCOMPAT C;A;I → SQUEEZE1B-(⍴B)=⍴C ⍝B ∧ C ARE VECTORS → 0 IF ANDREDUCE B=C SQUEEZE1B: → SQUEEZE1C IF 0=I←'' ⍴ ⍴ B // A←'' → SQUEEZE1B+⍳00 ∇ ∇ ABB←A (*) B,10 ⍝A TO THE B = EXP OF B TIMES NATURAL LOG OF A ABB←*B×LN A ∇ ∇ AS←LN X;A;B;G0;A1;A2 A←1 ∧ 1+X ≤ 0 A←A+A←COEF X B←0.5 × 1+A A1←0.5 × B+G0←SQRT A A2←(0.5 × A1+SQRT A1 × G0)-0.25 × A1 G0←0.69314718 × (BEXP X)-129 AS←G0+0.703125×(A-1)÷A2-0.0625×A1-0.25×B ∇ ⍝ PDF page 41 ∇ C←A LN B,11 C←(LN B) ÷ LN A ∇ ∇ A ← B (⊤) C;RHOA → DONE IF 0=(I←(A←'')⍴⍴B←,B) × ⍴C←,C // RHOA←(⍴B),⍴C LOOP: A←((-B[I]×C←⌊C÷B[I])+C),A ⍝PORNO → LOOP UL 0=I←I-1 DONE: A←RHOA ⍴ A ⍝ THIS DECODE DIFFERS FROM APL/360 IN THE TREATMENT OF: ⍝ NEGATIVE LEFT ARGUMENTS ⍝ ∧ NONCONFORMING DIMENSIONS ∇ ∇ A ← B (⊥) C;COUNT;I;LASTI;RHOB → SCALAR IF 0=A←'' ⍴ ⍴ RHOB←⍴B → MAKEONE IF 1=COUNT←RHOB[A] → MATMULT IF 1=I←1+'' ⍴ ⍴ B←,B LASTI←I-COUNT // A←1 ITER: → ITER+LASTI=I // A←(B[I]+A) × B[I←I-1] → ITER-⍳1