# Community/Conference2012/Talks/Dyalog Adoption of J Ideas

```Dyalog APL/W Conference 2011 Unicode Edition
Serial No : 000000
Tue Jul 24 16:22:29 2012
clear ws

c:\demos\jconf saved Tue Jul 24 14:32:02 2012

⍝ John Scholes - Dyalog Adoption of J ideas

⍝ Roger's influence!

⍝ Experiment: 3-trains (f g h) implement "forks":

⍝     (f g h) ⍵  →  (  f ⍵) g (  h ⍵)   ⍝ monadic case
⍝   ⍺ (f g h) ⍵  →  (⍺ f ⍵) g (⍺ h ⍵)   ⍝ dyadic case

(+/ ÷ ⍴) 1 2 3 4        ⍝ monadic fork
2.5
avg ← +/ ÷ ⍴            ⍝ naming the fork
avg 1 2 3 4             ⍝ applying the fork
2.5
8 12
avg dft 1               ⍝ display of fork
┌─┼─┐
/ ÷ ⍴
┌┘
+
⍝ Longer trains:

(+ , - , × , ÷) dft 1   ⍝ display of function train
┌─┼───┐
+ , ┌─┼───┐
- , ┌─┼─┐
× , ÷

6 (+,-,×,÷) 2           ⍝ A "vector of functions" !
8 4 12 3

125 {⍺*÷⍵} 3            ⍝ {...} direct definition "D-fns"
5
⍝ "constant functions" can be handy:

88 {10} 99              ⍝ {10} constant function,
10
2({10}×⍴)3              ⍝ fgh:     10    × (2⍴3)
30 30
2(10×⍴)3                ⍝ Agh: ⍺(A f h)⍵ → A f(⍺ h ⍵)
30 30
(10×⍳)4                ⍝ Agh:  (A f h)⍵ → A f(  h ⍵)
10 20 30 40

2(⌽10↑)⎕a               ⍝ fBh: ⍺(f B h)⍵ → ⍺ f(B h ⍵)
CDEFGHIJAB
(⌽10↑)⎕a                ⍝ fBh:  (f B h)⍵ →   f(B h ⍵)
JIHGFEDCBA
f10 ← ⊢10⊣              ⍝ fork returns 10
f10¨ ⍳4
10 10 10 10
d10←{10}                ⍝ constant dfn returns 10.

cmpx'd10 99' 'f10 99'   ⍝ comparison of expr timings.
d10 99 → 9.5E¯7 |   0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
f10 99 → 4.0E¯7 | -58% ⎕⎕⎕⎕⎕⎕⎕⎕

⊃ (,'-',)/ 'hello'      ⍝ fBh / ...
h-e-l-l-o

⍝ Summary of 3-train definitions:
⍝
⍝ (f g h)⍵ → (f ⍵)g(h ⍵)    ⍺(f g h)⍵ → (⍺ f ⍵)g(⍺ h ⍵)
⍝ (A g h)⍵ → A g(h ⍵)       ⍺(A g h)⍵ → A g(⍺ h ⍵)
⍝ (f B h)⍵ → f(B h ⍵)       ⍺(f B h)⍵ → ⍺ f(B h ⍵)

⍝ Dyalog already does hooks with relative ease:
⍝
⍝     ⍺ f∘g ⍵  → ⍺ f(g ⍵)   ⍝ Dyalog: dyadic hook
⍝       f∘g⍨ ⍵ → ⍵ f(g ⍵)   ⍝ Dyalog: monadic hook
⍝
⍝   f hook g  ←→  f∘g⍨⍨     ⍝ Dyalog: ambi-valent hook
⍝
⍝ So, in this experiment, ⍺(f g)⍵ means: f atop g:
⍝
⍝   ⍺(f g)⍵ → f(⍺ g ⍵)      ⍝ dyadic 2-train: atop
⍝    (f g)⍵ → f(  g ⍵)      ⍝ monadic 2-train: compose

2(⍪⍴)3              ⍝ →  ⍪(2⍴3) "column atop reshape"
3
3
6(  +,-,×,÷)2       ⍝ "vector of functions" from above
8 4 12 3
6(⌽ +,-,×,÷)2       ⍝ reverse atop vector of functions
3 12 4 8

⍝ ... but Roger has since talked me out of this,
⍝ so 2-trains will initially be a SYNTAX ERROR.

⍝ atop _can_ be expressed as a (nasty) fork:

2(⍪⍴)3              ⍝ 2-train: col atop reshape
3
3
2(⊢ ⊢∘⍪ ⍴)3         ⍝    fork: col atop reshape
3
3
⍝ hook _can_ be expressed as a (nasty) fork:

(⊣ + ⊢∘÷)4         ⍝   (f hook g) ⍵ → ⍵ f (g ⍵)
4.25
2(⊣ + ⊢∘÷)4         ⍝ ⍺ (f hook g) ⍵ → ⍺ f (g ⍵)
2.25

⍝ Syntactically possible 3-train forms: fgh Agh fBh
⍝ Syntactically possible 2-train forms: fg  Ag
⍝ Define the Ag form to be "left-argument currying"
⍝
⍝   (A g)⍵ → A g ⍵          ⍝ left argument currying

next ← 1+                   ⍝ successor function
next 3
4
⍝ "Right-operand currying" for dyadic operators:

inv ← ⍣¯1                   ⍝ ... to the power ¯1

next inv 3                  ⍝ predecessor function
2
fixpt ← ⍣≡                  ⍝ ... until match

1 +∘÷ fixpt 1               ⍝ Phi ("Golden Mean")
1.618033989

⍝ Combinations and more examples

f ← 32 + 1.8 ×              ⍝ Fahrenheit from Celsius
f dft 1                     ⍝ parse of train
┌─┴──┐
32 ┌─┼───┐
+ 1.8 ×

f ¯273 ¯40 0 100            ⍝ some familiar temps.
¯459.4 ¯40 32 212

c ← f inv                   ⍝ Celsius from Fahrenheit
c ¯459.4 ¯40 32 212
¯273 ¯40 0 100

⎕fx'z←tavg v' 'z←(+/v)÷⍴v'      ⍝ Tradfn average
davg ← {(+/⍵)÷⍴⍵}               ⍝ Dfn average
favg ← +/÷⍴                     ⍝ Fork average

cmpx'tavg 1 2' 'davg 1 2' 'favg 1 2'  ⍝ time comparison
tavg 1 2 → 3.4E¯6 |   0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
davg 1 2 → 2.7E¯6 | -22% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
favg 1 2 → 1.7E¯6 | -52% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕

⍝ Other primitive operators ...
⍝ for which we have only models at present.
⍝ http://dfns.dyalog.com

⍝ Rank ⍤
)copy dfns rank
c:\Home\dfns saved Mon Jul 16 13:20:36 2012

(2 2⍴1 2 2 1) ⍉rank 1 2 ⊢ 2 3 4⍴⍳99
1  2  3  4
5  6  7  8
9 10 11 12
0  0  0  0

13 17 21  0
14 18 22  0
15 19 23  0
16 20 24  0

⍝ Key ⌸
)copy dfns key
c:\Home\dfns saved Mon Jul 16 13:20:36 2012

5 2 2 1 1
a 5  b 2  r 2  c 1  d 1

⍝ Merge ⍈
)copy dfns merge
c:\Home\dfns saved Mon Jul 16 13:20:36 2012

mat←10⊥¨⍳4 5                    ⍝ matrix of numbers.

0 ((2 3)(2 4)merge'∘') mat      ⍝ 0s merged at specific coords
11 12 13 14 15
21  0 23  0 25
31  0 33  0 35
41 42 43 44 45

0 {0=3|⍵}merge'∘' ⊢ mat         ⍝ 0s merged every 3 items
11  0 13 14  0
0 22 23  0 25
31 32  0 34 35
41  0 43 44  0

⍝ Oh, and tally:  ≢⍵ → length of leading axis (scalar).

⍝ That's All Folks ...
)off
```