⍝ defs:

    :ReturnIf 3≠ ⎕nc'⎕SE.Dyalog.Utils.repObj'           ⍝ required library fn

    ⎕ex'Alpha'                                          ⍝ remove alias for 1
    ⎕ex (~∘' '¨ ↓⎕nl 3 4)~'defs' 'disp' 'externs' 'in'  ⍝ declutter for speed

    dup←{⍵ ⍵}                                           ⍝ single-line defn
    tup←{                                               ⍝ multi-line defn
        ⍵ ⍵ ⍵
    }

     avg ← (sum←(plus←+)(fold←⌿)) ÷ (num←≢)             ⍝ more definitions ...
    davg ← {(sum÷num)⍵}                                 ⍝ dfn
    each ← {⍺←⊢ ⋄ ⍺ ⍺⍺¨⍵}                               ⍝ dop
    dups ← dup each                                     ⍝ derived fn
    tups ← tup each
    isns ← (ns←⎕ns'')∘≡
   isnum ← ∊∘(digs←'0123456789')                        ⍝ named array comp
   vowel ← ∊∘'AEIOU'                                    ⍝ unnamed array comp
    same ← (succ←one∘plus)∘(pred←-∘(one←1))
    that ← {this ⍵}                                     ⍝ mutually recursive
    this ← {that ⍵}                                     ⍝   dfns
       F ← 32∘plus∘(×∘1.8)                              ⍝ Fahrenheit
     inv ← ⍣¯1                                          ⍝ derived operator
       C ← F inv                                        ⍝ → derived fn

    defs'avg'                       ⍝ no-names listing
avg ← +⌿÷≢

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Listing with names

    2 defs ''                       ⍝ all names / all defns
    C ← F inv          
    F ← 32∘plus∘(×∘1.8)
  avg ← sum÷num        
 davg ← {(sum÷num)⍵}   
 digs ← '0123456789'   
  dup ← {⍵ ⍵}          
 dups ← dup each       
 each ← {⍺←⊢ ⋄ ⍺ ⍺⍺¨⍵} 
 fold ← ⌿              
  inv ← ⍣¯1            
 isns ← ns∘≡           
isnum ← ∊∘digs         
  num ← ≢              
  one ← 1              
 plus ← +              
 pred ← -∘one          
 same ← succ∘pred      
 succ ← one∘plus       
  sum ← plus fold      
 that ← {this ⍵}       
 this ← {that ⍵}       
 tups ← tup each       
vowel ← ∊∘'AEIOU'      

    2 defs 'same' 'succ' 'pred'     ⍝ display of specific definitions
same ← succ∘pred
succ ← one∘plus 
pred ← -∘one    

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Top-down indented display:

    1 1 defs 'avg'                  ⍝ top-down defns of "avg"
avg ← sum÷num    
  sum ← plus fold
    plus ← +     
    fold ← ⌿     
  num ← ≢        

    2 1 defs ''                     ⍝ all defns top-down
C ← F inv              
  F ← 32∘plus∘(×∘1.8)  
    plus ← +           
  inv ← ⍣¯1            
avg ← sum÷num          
  sum ← plus fold      
    fold ← ⌿           
  num ← ≢              
davg ← {(sum÷num)⍵}    
dups ← dup each        
  dup ← {⍵ ⍵}          
  each ← {⍺←⊢ ⋄ ⍺ ⍺⍺¨⍵}
isns ← ns∘≡            
isnum ← ∊∘digs         
  digs ← '0123456789'  
same ← succ∘pred       
  succ ← one∘plus      
    one ← 1            
  pred ← -∘one         
tups ← tup each        
vowel ← ∊∘'AEIOU'      
that ← {this ⍵}        
  this ← {that ⍵}      

    avl←{(⍳×/1↓⍴⍵)~⍵×⊃⍺⌷⍺⍺}         ⍝ some more dfn/op defns
    box←{⍵⌿⍵/⍵ ⍵⍴⍳⍵×⍵}
    cmap←{⊂[⍳⍴⍴⍵]1∊¨⍵∘.=⍵}
    emt←{(,⍵=0)/,⍳⍴⍵}
    nxt←{(⍺(⍺⍺ avl)⍵)⊣@(⊂⍺)¨⊂⍵}
    nxtv←{⊃,/⍺∘(⍺⍺ nxt)¨⍵}
    rcb←{(⍳⍵),¨box⊃⍵*÷2}
    sfmt←{⊂[3 4]1 3 2 4⍉(2/(⍴⍵)*÷2)⍴⍵}
    sudoku←{sfmt⊃cmap∘rcb svec ⍵}
    svec←{⊃(⍺⍺⍴⍵)nxtv/(emt ⍵),⊂⊂⍵}

    1 1 defs 'sudoku'               ⍝ top-down display
sudoku ← {sfmt⊃cmap∘rcb svec ⍵}       
  sfmt ← {⊂[3 4]1 3 2 4⍉(2/(⍴⍵)*÷2)⍴⍵}
  cmap ← {⊂[⍳⍴⍴⍵]1∊¨⍵∘.=⍵}            
  rcb ← {(⍳⍵),¨box⊃⍵*÷2}              
    box ← {⍵⌿⍵/⍵ ⍵⍴⍳⍵×⍵}              
  svec ← {⊃(⍺⍺⍴⍵)nxtv/(emt ⍵),⊂⊂⍵}    
    nxtv ← {⊃,/⍺∘(⍺⍺ nxt)¨⍵}          
      nxt ← {(⍺(⍺⍺ avl)⍵)⊣@(⊂⍺)¨⊂⍵}   
        avl ← {(⍳×/1↓⍴⍵)~⍵×⊃⍺⌷⍺⍺}     
    emt ← {(,⍵=0)/,⍳⍴⍵}               

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Bottom-up dependencies:

    2 ¯1 defs 'plus'                ⍝ defns dependent on "plus"
plus ← +             
  F ← 32∘plus∘(×∘1.8)
    C ← F inv        
  succ ← one∘plus    
    same ← succ∘pred 
  sum ← plus fold    
    avg ← sum÷num    

    2 ¯1 defs 'one' 'plus'          ⍝ defns dependent on "one" and "plus"
one ← 1              
  pred ← -∘one       
plus ← +             
  F ← 32∘plus∘(×∘1.8)
    C ← F inv        
  succ ← one∘plus    
    same ← succ∘pred 
  sum ← plus fold    
    avg ← sum÷num    

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ changing definitions:

    defs 'plus ← -∘-'               ⍝ redefinition of "plus"

    0 defs 'same'                   ⍝ change to "plus" has changed "same"
same ← 1∘(-∘-)∘(-∘1)

    0 defs defs 'div←÷'             ⍝ new definition "div"
div ← ÷

    1 defs 'avg'                    ⍝ incorporates new defn
avg ← sum div num

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ -ive names: tree only

    ¯1 defs ⊂⎕cr'succ'              ⍝ ]box -names=fns
┌─┬────────┐
│1│┌─┬────┐│
│ ││∘│plus││
│ │└─┴────┘│
└─┴────────┘

    ¯2 defs ⊂⎕cr'succ'              ⍝ ]box -names=all
┌───┬────────┐
│one│┌─┬────┐│
│   ││∘│plus││
│   │└─┴────┘│
└───┴────────┘

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ edge cases

    ∧/{(0 0⍴'')≡ ⍵ defs'undef'}¨ ,0 1∘., 0 ¯1 1     ⍝ undefined name
1
    avg ← {sum←+⌿⍵ ⋄ sum÷≢⍵}        ⍝ avg with local name "sum"
    1 1 defs 'avg'                  ⍝ top-down display does not include "sum"
avg ← {sum←+⌿⍵ ⋄ sum÷≢⍵}

    (0 0⍴'')≡ 1 1 (⎕ns'')defs ''    ⍝ empty namespace
1

Back to: code

Back to: Workspaces