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
