Pascal wrote: > '+: y' (1 : 'if. isNoun ''u'' do. u =. (13 : u) end. u ') 3 > NB. TIL you can add code after 'end.' on same line.
The reason you can put 'end.' on the same line is that in an explicit context (i.e. running under : ), 'end.' is considered punctuation, as is any control word. That is, from :'s perspective, a control word actually delimits and defines a line, as much as CRLF (or LF) does. You can see this in action by asking 5!:7 for the lines of an explicit definition: iffy=:1 : 'if. isNoun ''u'' do. u =. (13 : u) end. u ' (<a:;<<1) { (1) 5!:7<'iffy' +-+----------+ |0|if. | +-+----------+ |1|isNoun'u' | +-+----------+ |2|do. | +-+----------+ |3|u=.(13 :u)| +-+----------+ |4|end. | +-+----------+ |5|u | +-+----------+ This is perhaps interesting, but is it useful? Well, there are some circumstances where we'd like to take a large multi-line program and fit it into a single line. Sometimes we want this for technical reasons (e.g. evaluating one-liners through the J IRC bots), sometimes for pedagogical purposes ("Hey, look at what I can do with /one line/ of J code!"), and sometimes because J's syntax asks us to break up a thought we think would be clearest expressed in a single, unbroken line. In short, we'd line a "logical line break" along the same lines and for the same reasons APL has <> and C has ; etc. Puzzle: how can we take advantage of control-words-as-delimiters in order to fit multiple logical lines into a single physical line, without imposing or requiring the user to impose semantic changes to the program? Things to consider: logical lines that produce adverbs and conjunctions (which would either gobble up or choke on separators like [), the interplay of any required arguments to control words (e.g. assert. 1), brevity (we are trying to fit a large thought into a single line here), etc. Solution in: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 3 : 'smoutput ''just'' label_. smoutput ''use'' label_. smoutput ''an unlabelled'' label_. smoutput ''label'' ' 0 just use an unlabelled label -Dan PS: One other thing you might find surprising: control words can be nested. iffier =: adverb define if. if. noun = nc<'u' do. u=. 13 : u end. 10 > u y do. 'u applied to y is less than 10' else. 'u applied to y is too big' end. ) +: iffier 5 u applied to y is too big -: iffier 5 u applied to y is less than 10 '+: y' iffier 5 u applied to y is too big '-: y' iffier 5 u applied to y is less than 10 ----- Original Message --------------- Subject: [Jprogramming] best way to write modifier that can have m or u From: Pascal Jasmin <godspiral2...@yahoo.ca> Date: Mon, 24 Feb 2014 09:28:54 -0800 (PST) To: "programm...@jsoftware.com" <programm...@jsoftware.com> For some reason, I remember there was an easier way to get an adverb to notice whether it had an m or u parameter, but I can't recall if that was the case, or how to do it. Is there an easier way to write the adverb below? isNoun =: (0 = 4!:0 ( :: 0:))@:< 2 (1 : 'if. isNoun ''u'' do. u else. u y end.') 3 2 +: (1 : 'if. isNoun ''u'' do. u else. u y end.') 3 6 '+: y' (1 : 'if. isNoun ''u'' do. (3 : u) y else. u y end.') 3 6 '+: y' (1 : 'if. isNoun ''u'' do. u =. (13 : u) end. u ') 3 NB. TIL you can add code after 'end.' on same line. 6 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm