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

Reply via email to