I use a variety of logging mechanisms, depending on what I want to focus on.
One simple approach is to precede a line with smoutput. Or, if I want to log in the middle of an expression, I often use ([smoutput) (+/ %&([smoutput) #) 2 3 5 7 If I want to label my results, I'll often use something like: smoutput 'label'; expression (([:([ smoutput@;~&'sum')+/) % [: ([smoutput@;~&'count') #) 2 3 5 7 If the expression is really an assignment statement, I'll often use the name of the variable as the label. However, it's hard for me to predict where I'll be interested in logging, so I generally only opportunistically add logging statements to code when I am specifically curious about how it looks from the inside. And, of course other approaches are also possible. (For example, j's trace facility can sometimes be what I need). require'trace' trace '(+/ % #) 2 3 5 7' I hope this helps, -- Raul On Fri, Sep 13, 2013 at 2:19 PM, Pascal Jasmin <[email protected]> wrote: > Thanks very much. > > In terms of usefulness, > ifC=: 1 : 'if. flag1_z_ do. u y else. y end.' > pD =: smoutput ifC > test=: +: ifC > > test controlA a=. 1 2 3 > 2 4 6 > test a=. 1 2 3 > 1 2 3 > > The pD verb can produce verbose output for debugging only when asked. > > 2 points to a single line: > 1. eliminates 11 lines of irritating clutter that I don't want to see. > 2. If I or someone else copies just the definition without the > initialization variable into a new project, in someone's lifetime, I/they > will get a domain error, and will either hate the function or their lives > because of it. I might make this error more likely to occur by inadvertantly > inserting code between the function and the initialization. > > An improvement I'm not sure is possible would be to modify controlA and/or > ifC to not access y, ie. be tacit. > > ----- Original Message ----- > From: Raul Miller <[email protected]> > To: General forum <[email protected]> > Cc: > Sent: Friday, September 13, 2013 1:25:06 PM > Subject: Re: [Jgeneral] Bug in adverb define > > It's not at all clear to me why doing this kind of thing on "one line" > is useful. > > That said, this example of yours: > > flag1_z_ =: 0 [ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u > y';'flag1_z_ =: 0';'o') > > has this grammar: > > name =: noun verb name =: noun conjunction noun > > Which, simplifies to > > name =: noun verb adverb > > In other words, you are executing controlA with u defined as [ which > then simplifies to > > name =: noun verb > > and that's just bad grammar. A simple transformation which would make > it grammatically correct would be: > > name =: verb noun > > and... projecting this back into your original sentence, it would become > > flag1_z_ =: ([ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u > y';'flag1_z_ =: 0';'o')) 0 > > However, since I have no idea what you are trying to accomplish, I > have no idea if this is relevant to your efforts. > > FYI, > > -- > Raul > > On Fri, Sep 13, 2013 at 1:09 PM, Pascal Jasmin <[email protected]> wrote: >> thank you. I'm still not able to combine into one line (which IIUC can be >> done with verb defines) >> flag1_z_ =: 0 [ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u y';'flag1_z_ =: >> 0';'o') >> >> >> btw, The dyad version define is: >> (flag1_z_ =: 0) [ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u y';'flag1_z_ =: >> 0';'o';':';'flag1_z_ =: 1';'o=. x u y';'flag1_z_ =: 0';'o') >> >> >> >> >> ----- Original Message ----- >> From: Don Guinn <[email protected]> >> To: General forum <[email protected]> >> Cc: >> Sent: Friday, September 13, 2013 12:18:34 PM >> Subject: Re: [Jgeneral] Bug in adverb define >> >> Need to add parens. >> >> controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u y';'flag1_z_ =: 0';'o') >> >> >> On Fri, Sep 13, 2013 at 9:18 AM, Pascal Jasmin <[email protected]>wrote: >> >>> The following in a script should work according to >>> http://www.jsoftware.com/help/dictionary/dicth.htm >>> flag1_z_ =: 0 >>> controlA_z_ =: 1 : 'flag1_z_ =: 1';'o=. u y';'flag1_z_ =: 0';'o' >>> >>> It results in a syntax error script in J7. The syntax error can be >>> eliminated by changing 1 : to 3 : >>> >>> The adverb (and definition) works as a 4 line definition. Its purpose is >>> to send control flags to a verb which changes its behaviour if called with >>> the adverb. The importance of getting it on one line is that supporting >>> dyads would take a multiline definition 10 lines with the ending ), and its >>> the type of utility function that can be cloned to control2A control3A and >>> so, single line definitions are more reusable. >>> >>> The multiline version is: >>> controlA_z_ =: 1 : 0 >>> flag1_z_ =: 1 >>> o=. u y >>> flag1_z_ =: 0 >>> o >>> ) >>> >>> Ideally I'd like to be able to write a definition line such as: >>> >>> flag1_z_ =: 0 [ controlA_z_ =: 1 : 'flag1_z_ =: 1';'o=. u y';'flag1_z_ =: >>> 0';'o' >>> >>> (which does load if '1 :' changed to '3 :') >>> ---------------------------------------------------------------------- >>> 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 > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
