Neat! That is what I had been looking for but hadn't been able to figure it out.
As you say, J provides so many ways to do something. On Sun, Jun 1, 2014 at 12:53 PM, Dan Bron <[email protected]> wrote: > That is a creative application of 6!:4! Thanks for sharing it. > > In re: your specific atom-counting tool, can I suggest > > (($~$)L:0"0~ i.@:#)z > +-----+-----+-+ > |0 0 0|1 1 1|2| > | |1 1 1|2| > | | |2| > | | |2| > +-----+-----+-+ > > ? > > Of course, we could extend this to work with arbitrarily-nested arrays, > depending on what you're after. > > In re: your larger question of variable scope, well there's a lot to say > there, but I'll just leave it at: there are a lot of tradeoffs to consider, > and in general J offers ways to achieve one's ends, without having to > manage state (as seen in the above example). > > -Dan > > > On Jun 1, 2014, at 1:25 PM, Don Guinn <[email protected]> wrote: > > > > One problem that has bugged me is the inability for an explicit > definition > > to modify a value accessible to a caller without having to create a > global > > name. A tacit definition can reference the caller's local names but > copulas > > do not work in a tacit definition. And names in an explicit definition > are > > either local within the definition or global. > > > > > > It is not a serious problem, but there are a few situations where it > cannot > > be avoided. Such as the verb argument to an adverb or conjunction. > > > > > > One problem I was dealing with was to identify where atoms were within a > > boxed array. > > > > > > ]z=:'abc';(i.2 3);,.1 2 3 4 > > > > +---+-----+-+ > > > > |abc|0 1 2|1| > > > > | |3 4 5|2| > > > > | | |3| > > > > | | |4| > > > > +---+-----+-+ > > > > > > I wanted to create a corresponding boxed array containing > > > > > > +-----+-----+-+ > > > > |0 0 0|1 1 1|2| > > > > | |1 1 1|2| > > > > | | |2| > > > > | | |2| > > > > +-----+-----+-+ > > > > > > This gets the job done but n has to be global. It cannot be a local name. > > > > > > inc=: 3 : '($y)$n=:>:n' > > > > n=:_1 > > > > inc L:0 z > > > > +-----+-----+-+ > > > > |0 0 0|1 1 1|2| > > > > | |1 1 1|2| > > > > | | |2| > > > > | | |2| > > > > +-----+-----+-+ > > > > > > I needed to find a primitive which has side effects. One to put in an > > explicit definition so each time the definition is executed the primitive > > returns a different result. One such is ? (or ?.) but the result is > random > > and there is no guarantee that it won't return duplicate numbers. Another > > is 6!:9 '' (clock counter). It is always ascending but no guarantee that > > fast enough processors might return the same number in successive calls. > > > > > > A new foreign was added in J7 - 6!:4'' (parser calls) which does the job > > quite nicely. > > > > > > (3 : '6!:4''''')"0 ]i.3 4 > > > > 6836 6837 6838 6839 > > > > 6840 6841 6842 6843 > > > > 6844 6845 6846 6847 > > > > > > This gives the desired result. No global name required. > > > > > > inc=. 4 : '($y)$n-~6!:4 ''''' > > > > n=.2+6!:4 '' > > > > (n&inc) L:0 z > > > > +-----+-----+-+ > > > > |0 0 0|1 1 1|2| > > > > | |1 1 1|2| > > > > | | |2| > > > > | | |2| > > > > +-----+-----+-+ > > > > > > I'm not sure what the purpose of 6!:4 is, but it is an interesting tool. > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
