Exactly.

Here are some examples:

  setY=: 3 :'Y=:y'

  set=: 1 :'(m)=:y'
  'X' set

The point though, is that you can throw one of these into the middle
of a large (perhaps tacit) expression.

So another variation might be:
   withXY=: 1 :0
      X=: x
      Y=: y
      XuY=: x u y
   )

Sort of a mini-dissect - like for when the values you are working with
are necessarily large.

I hope this makes sense,

-- 
Raul


On Thu, Apr 19, 2018 at 11:28 AM, Thomas Hickey <[email protected]> wrote:
> 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to