I have a data-massaging engine which delivers me an array to plot. In
certain obscure circumstances this array can be "poisoned", whereupon
the plot package (J602) falls over and dies.

I spent an evening tearing out my 3 remaining hairs, trying to work
out what was happening. At last I think I know. The proper remedy is
not obvious, since IMO there's more than one bug manifesting here.

Let me illustrate with a simple example:

   require 'plot'

   ]z=: 1j2 , i.9
1j2 0 1 2 3 4 5 6 7 8
   z=: }. z
   z
0 1 2 3 4 5 6 7 8
   ]Z=: i.9
0 1 2 3 4 5 6 7 8
   z -: Z
1
   plot Z       NB. (plots successfully)
   plot z
|domain error: glcmds
|       glcmds buf

So we have two nouns, one of which (Z) plots successfully, and the
other (z) doesn't.
They look the same, and Match (-:) says they're the same. How (if at
all) do they differ?
Answer:

   datatype Z
integer
   datatype z
complex

Although all the imaginary parts of z are 0, it still retains a memory
of once having been complex, which is enough to "poison" plot.
The "poison" is remarkably contagious and resilient. But I've come up
with a verb capable of cleaning up z for plotting:

   real=: ([: {. +.)"0
   real z
0 1 2 3 4 5 6 7 8
   datatype z
complex
   datatype real z
floating
   plot real z  NB. (now it plots successfully)

Two questions:

1. Can anyone think of a neater way of cleaning up z than my verb:
real? I expect there's a primitive capable of filtering the "poison"
but I haven't found it yet.

2. Can someone fix the plot package so that it either tolerates or
correctly reports "poisoned" arrays, and doesn't just fall over in a
puzzling way?
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to