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 <[email protected]>
Date: Mon, 24 Feb 2014 09:28:54 -0800 (PST)
To: "[email protected]" <[email protected]>
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