Since Dijkstra features prominently in your essay, you may be interested in *A Letter from Dijkstra on APL <https://www.jsoftware.com/papers/Dijkstra_Letter.htm> .*
On Sun, Mar 15, 2020 at 9:14 AM Devon McCormick <[email protected]> wrote: > The "Array Thinking" page is at > https://code.jsoftware.com/wiki/Array_Thinking but it still needs some > work > on formatting. > > On Sun, Mar 15, 2020 at 12:12 PM Devon McCormick <[email protected]> > wrote: > > > Yes - on the "Array Thinking" page I referred to a similar note you sent > a > > while back and I quote from the Perlis paper. The explicit reference to > > the APL expression on the Ken Iverson page (at > > > https://en.wikipedia.org/wiki/Kenneth_E._Iverson#/media/File:APLparen.png) > > is nice, especially in its similarity to the J version I'm using. > > > > On Sun, Mar 15, 2020 at 10:49 AM Roger Hui <[email protected]> > > wrote: > > > >> Your one-liner on parentheses nesting has an ancient and honorable > >> pedigree. See the Ken Iverson Wikipedia page > >> <https://en.wikipedia.org/wiki/Kenneth_E._Iverson> (in the IBM > >> (1960-1980) > >> section) and the third paragraph of Alan Perlis's "*APL is more French > >> than > >> English*" <https://www.jsoftware.com/papers/perlis78.htm>. > >> > >> > >> > >> On Sun, Mar 15, 2020 at 12:38 AM Devon McCormick <[email protected]> > >> wrote: > >> > >> > There's this (adapted from my new "Array Thinking" page on the J > wiki): > >> > NB. String from https://wiki.c2.com/?LispShowOffExamples > >> > string=. '(flet ((inside-p (obj) (lambda (d) (inside-p obj > (ray-point > >> > ray d)))))' > >> > string,:' '-.~":'()' ([:+/\1 _1 0{~i.) string NB. Example result > >> > (flet ((inside-p (obj) (lambda (d) (inside-p obj (ray-point ray d))))) > >> > 1111112333333333344443344444444554455555555555555666666666666666654321 > >> > NB. Final "1" indicates we are missing a closing paren > >> > The one-liner is " '()' ([:+/\1 _1 0{~i.) string"; the bit preceding > >> this > >> > simply squishes the parentheses' counts to single, text digits so they > >> > align character-by-character with the string (won't work if the string > >> > presents more than 9 levels of nesting). > >> > Also, that "LISP Show-off" page referenced might be a good source of > >> > succinct algos amenable to translation into J. > >> > > >> > Another one I resurrected recently is something I wrote a long time > ago > >> in > >> > APL called "interval sum". Given two two-column tables - "iv0" and > >> "iv1" - > >> > of start, stop points defining intervals, this expression returns the > >> > (#iv0) x #iv1 table of intersections between each interval. This is > >> > positive for intervals that overlap, negative for disjunct intervals > >> > (measuring the gap between them), and zero for intervals that share > only > >> > one endpoint. So, for example: > >> > > >> > (iv0=. 0 5,_1 4,2 3,6 3,5 8,:6 8);iv1=. _1 0,1 3,0 5,_1 8,:9 10 > >> > +----+-----+ > >> > | 0 5|_1 0| > >> > |_1 4| 1 3| > >> > | 2 3| 0 5| > >> > | 6 3|_1 8| > >> > | 5 8| 9 10| > >> > | 6 8| | > >> > +----+-----+ > >> > > >> > iv0 (([:|: [:/:~"1 [) (([:|:[ 0}~ [:- 0{[) +/ . <./ ]0}~ [:- 0{]) > >> [:|: > >> > [:/:~"1 ]) iv1 > >> > 0 2 5 5 _4 > >> > 1 2 4 5 _5 > >> > _2 1 1 1 _6 > >> > _3 0 2 3 _3 > >> > _5 _2 0 3 _1 > >> > _6 _3 _1 2 _1 > >> > > >> > The following attempts to illustrate how the inner product " +/ . <./ > " > >> > works. The trick is that we negate the 0th column of each set of > >> intervals > >> > (after sorting so that the starting point of the interval is less than > >> or > >> > equal to the ending point) so that the <./ gives us the negative of > the > >> > larger of the two starting points. I have a marvelous proof of why > this > >> > works but the margin is too small to contain it*. > >> > > >> > In any case, we see here the two sets of intervals as shown above but > >> with > >> > their initial columns negated and the result of the inner product > >> > positioned in a way to try to make clear what is happening: > >> > +----+-----------------+ > >> > ||:iv1| 1 _1 0 1 _9 | > >> > |iv0 | 0 3 5 8 10 | > >> > +-----+----------------+ > >> > | 0 5 | 0 2 5 5 _4 | (0<.1)+(5<.0)=0; (0<._1)+(5<.3)=2; > >> > (0<.0)+(5<.5)=5... > >> > | 1 4 | 1 2 4 5 _5 | (1<.1)+(4<.0)=1; (1<._1)+(4<.3)=2; > >> > (1<.0)+(4<.5)=4... > >> > |_2 3 |_2 1 1 1 _6 | > >> > |_6 3 |_3 0 2 3 _3 | > >> > |_5 8 |_5 _2 0 3 _1 | > >> > |_6 8 |_6 _3 _1 2 _1 | > >> > +-----+----------------+ > >> > > >> > *Come to NYCJUG on Tuesday, April 14th to see the proof. > >> > > >> > > >> > > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > >> > > > > > > -- > > > > Devon McCormick, CFA > > > > Quantitative Consultant > > > > > > -- > > Devon McCormick, CFA > > Quantitative Consultant > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
