A couple of the global assignments were deliberate to make it easier to play with the data after the displayFits function was called, the others leftovers I forgot to take out. I agree, however, that they are all wrong.
What would an 'identity function that updates a variable' look like? It sounds like it's just a more hidden side effect that has similarities to setting a global. --Th On Thu, Apr 19, 2018 at 10:57 AM, Raul Miller <[email protected]> wrote: > Stops are one good approach, echo statements another good approach, > temporary =: another, and an identity function which updates a variable is > another, and the dissect and trace facilities are also good approaches. > > Basically we’re talking about choice of tools, and our understanding of the > problems we’re trying to find. > > Sometimes it’s best to stick with just one approach, but they all have some > value. > > — > Raul > > On Wednesday, April 18, 2018, Devon McCormick <[email protected]> wrote: > > > On "=." in scripts: I never thought of using =: because it's easy to set > a > > stop in a script if I want to examine those local values and this also > > allows access to everything else in the function context without changing > > any code. For example: > > > > 13!:3 'J2StdCvtNums 0 4 6 9 10 11 12 17 21 22 24 26 28' *NB. Set stop > > lines* > > 13!:0]1 *NB. Halt on interrupt* > > 'S' J2StdCvtNums _3.14 6.02e_23 *NB. Convert J numbers to std > rep* > > -3.1400000000000001 0.0000000000000000 *NB. Didn't stop - why?* > > 13!:3 'J2StdCvtNums *:* 0 4 6 9 10 11 12 17 21 22 24 26 28' *NB. > Dyadic > > stops* > > 'S' J2StdCvtNums _3.14 6.02e_23 > > |stop: J2StdCvtNums > > | 'S'=x > > |J2StdCvtNums[:0] > > 13!:4'' *NB. Resume execution from current line.* > > |stop > > | ' '={.,y > > |J2StdCvtNums[:0] NB. Same line because multiple statements. > > 13!:4'' > > |stop > > | toStd=.-.'J'-:''$'2'-.~,x > > |J2StdCvtNums[:4] > > 13!:0]0 *NB. Exit debug* > > 13!:0]1 NB. Halt on interrupt > > > > > > On Wed, Apr 18, 2018 at 6:21 PM, Henry Rich <[email protected]> > wrote: > > > > > On =: in scripts: When I replace =. with =: for debugging purposes, I > > > always precede it with 2 spaces: > > > > > > name =: value > > > > > > Then after testing a global replace of ' =:' with '=.' removes the > > global > > > assignments. > > > > > > Henry Rich > > > > > > > > > On 4/18/2018 6:16 PM, Marshall Lochbaum wrote: > > > > > >> This is a perfectly good use of the forums in my book. At the very > > >> least, we've had similar posts before and no one's complained. > > >> > > >> Overall your program looks pretty good to me. It's not leveraging the > > >> Full Power of J™, but it's a great start. You know what I. does! > > >> > > >> There are some ways to use arrays to do more of your work for you. You > > >> write > > >> > > >> 'minCut maxCut' =. x > > >> ... > > >> minWanted =: (<.minCut*#srtData){srtData > > >> maxWanted =: (<.maxCut*#srtData){srtData > > >> > > >> but this is the same as > > >> > > >> 'minWanted maxWanted' =: (<.x*#srtData){srtData > > >> > > >> since each of * <. and { has rank zero, that is, maps over arrays, on > > >> the side of x. (Unrelatedly, these should probably use =. rather than > =: > > >> to avoid global assignment. It looks like they might have been =: for > > >> debugging, but if so, it's good practice to look over the code again > and > > >> change them back when you're done.) > > >> > > >> A more sophisticated example is the plane-scaling code in displayFits. > > >> You use different code for each different number of scalings to do: > > >> > > >> r =. minmax scaleT2D 0{imarray > > >> select. 3<.{.$imarray NB. use up to 3 planes > > >> case. 3 do. > > >> g =. minmax scaleT2D 1{imarray > > >> b =. minmax scaleT2D 2{imarray > > >> case. 2 do. > > >> b =. minmax scaleT2D 1{imarray > > >> g =. -: r+b NB. average of red and blue > > >> case. 1 do. > > >> 'g b'=. r;r > > >> end. > > >> > > >> Instead, you could do all the scalings in one go: > > >> ((#imarray) is like ({.$imarray), but it is a scalar and not a > vector.) > > >> > > >> numScales =. 3<.#imarray NB. use up to 3 planes > > >> scaled =. minmax scaleT2D"_ _1 numScales {. imarray > > >> if. numScales < 3 do. > > >> avg =. (+/ % #) scaled > > >> scaled =. scaled , (3-numScales)#,:avg > > >> end. > > >> 'r g b' =. scaled > > >> > > >> This example first uses scaleT2D with an explicit rank to operate on > > >> each of the first numScales planes. If you're not familiar with it, my > > >> favorite explanation of the rank conjunction (") is > > >> http://www.jsoftware.com/help/jforc/loopless_code_i_verbs_have_r.htm. > > >> A rank of (_ _1), that is, infinity on the left and minus one on the > > >> right, means to apply the function to the entire left argument and > each > > >> subarray of the right argument, effectively mapping over only the > right > > >> argument. I could have used a rank of 2 rather than _1 on the right, > but > > >> rank _1 is more flexible--it would work even if the planes were > instead > > >> three-dimensional. > > >> > > >> After this compuation, scaled is a three-dimensional array of the > first > > >> numScales planes of imarray. The average of its planes can be found > with > > >> the standard averaging function (+/ % #), which happens to be the > > >> canonical example of a fork. If you're interested, these are described > > >> at http://code.jsoftware.com/wiki/Vocabulary/fork. > > >> > > >> An exponent like (2^8) unfortunately always evaluates to a > > >> floating-point number. I habitually use (<.@^) when I know the > arguments > > >> are integers to avoid accidentally promoting to floats. > > >> > > >> > > >> I actually gave a talk on a task similar to the parsing you do here. > My > > >> task was to parse the header of a simple wave file. A script version > > >> (there's no recording that I'm aware of) is at > > >> http://code.jsoftware.com/wiki/Community/Conference2014/Talk > > >> s/UsingDataAsCode > > >> and the current script that I use based on this is > > >> https://github.com/mlochbaum/JSound/blob/master/wav.ijs. > > >> This is certainly difficult material for a beginning J programmer, but > > >> the techniques discussed in the talk might be useful for you as you > gain > > >> more skill. > > >> > > >> One neat trick similar to the one used there: rather than write > > >> > > >> bitpix =. hdata getHdrVal 'BITPIX' > > >> naxis =. hdata getHdrVal 'NAXIS' > > >> naxis1 =. hdata getHdrVal 'NAXIS1' > > >> naxis2 =. hdata getHdrVal 'NAXIS2' > > >> naxis3 =. hdata getHdrVal 'NAXIS3' > > >> > > >> you might use > > >> > > >> fields =. ;: 'BITPIX NAXIS NAXIS1 NAXIS2 NAXIS3' > > >> (fields) =. hdata&getHdrVal&.> fields > > >> > > >> and then the fields will be defined in variables BITPIX, etc. > > >> > > >> Another very cool trick that I found after the talk would be useful > > >> here: > > >> > > >> select. bitpix > > >> case. _32 do. adata =. (naxis3,naxis2,naxis1)$ |. _1 fc |. > > >> rdata > > >> case. _64 do. adata =. (naxis3,naxis2,naxis1)$ |. _2 fc |. > > >> rdata > > >> case. 16 do. adata =. (naxis3,naxis2,naxis1)$ |. _1 ic |. > > >> rdata > > >> case. 32 do. adata =. (naxis3,naxis2,naxis1)$ |. _2 ic |. > > >> rdata > > >> end. > > >> > > >> The idea is to make an adverb (mine is audioconvert in wav.ijs) which > > >> takes a format specification like bitpix and returns a conversion > > >> function. Something like: > > >> > > >> rawconvert =: 1 : 0 > > >> select. u > > >> case. _32 do. _1&fc > > >> case. _64 do. _2&fc > > >> case. 16 do. _1&ic > > >> case. 32 do. _2&ic > > >> case. do. 'Invalid format' assert 0 > > >> end. > > >> ) > > >> > > >> which can then be called with > > >> > > >> cvt =. bitpix rawconvert NB. A conversion function > > >> adata =. (naxis3,naxis2,naxis1)$ |. cvt |. rdata > > >> > > >> Now the really cool thing is that J knows how to invert each of these > > >> functions. So when you want to store the data again, you just use > > >> (cvt^:_1)! This is a J-only technique: I don't know of any other > > >> language that has the functional capabilities and the automatic > > >> inversion required to do it. > > >> > > >> There's always more to say but I think that's enough for one email. > Good > > >> luck with your future J projects! > > >> > > >> Marshall > > >> > > >> On Wed, Apr 18, 2018 at 02:47:02PM -0400, Thomas Hickey wrote: > > >> > > >>> As one of my first J programs, I've written a minimal viewer for > FITS > > >>> files, the standard way of sharing astronomical data, especially > > images. > > >>> > > >>> I'd appreciate it if someone could take a look at it and let me know > > how > > >>> the code (80 lines of J) looks. I know I've replaced some really > > awkward > > >>> code in it, so I imagine there are better ways of doing lots of > things. > > >>> > > >>> The code is on GitHub at https://github.com/ThomasBHickey/JFits, > > along > > >>> with a sample FITS file in the fitsSample folder. Pointers on > > >>> organizing J > > >>> code on GitHub would be appreciated as well. > > >>> > > >>> Or is there a better way to accomplish this than the programming > forum? > > >>> I > > >>> know this is longer than most of the questions that are posted here, > > but > > >>> I > > >>> think it is an interesting application of J. > > >>> > > >>> --Th > > >>> ------------------------------------------------------------ > ---------- > > >>> For information about J forums see http://www.jsoftware.com/ > forums.htm > > >>> > > >> ------------------------------------------------------------ > ---------- > > >> For information about J forums see http://www.jsoftware.com/ > forums.htm > > >> > > > > > > > > > --- > > > This email has been checked for viruses by AVG. > > > http://www.avg.com > > > > > > > > > ---------------------------------------------------------------------- > > > For information about J forums see http://www.jsoftware.com/forums.htm > > > > > > > > > > > -- > > > > 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 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
