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

Reply via email to