Beyond just having no items, a more important consideration in defining empty is what happens when you append to it.
The empty table (i.0 0) or empty vector or scalar (i.0) are the two real world candidates for coding empty. And both are appropriate "empty initializations" for setting up an appendable data structure. While its very common to care about whether data has no items or not, in data applications there is a useful difference between null (unassigned) and nothing/empty (assigned), including applications for merging edits (nulls do not override data, empty does). J offers unlimited coding options for various forms of nothingness. For example i.0 1 (can be used for errors or type codes for other values (boxes) in the same variable, or for the above "data merge" rules. The shorter way to make my main point, is that intializations mostly in the context of append is the relevant use of empty for your application. Where append does not apply, but a distinction with null might, i.0 0 seems like a fair choice. But we could also standardize on i.0 0 0, or i.0 1 as a code independent of append behaviour. Though, I expect the consensus is that these issues are too esoteric to need a general framework. ________________________________ From: Ian Clark <[email protected]> To: [email protected] Sent: Saturday, June 10, 2017 12:38 AM Subject: Re: [Jprogramming] Empty lists? It's a nice point: is a noun "empty" because it has no atoms – or because it has no items? My appeal for "a reliable test for emptiness" was not an invitation to post code, but invite the community to reach a consensus on this, for inclusion in a proposed NuVoc page. I hadn't meant to divert the discussion away from what IMO is the topic: helping a beginner correctly handle an empty noun (and/or empty list). Speaking for myself, in the past I've used both Jasmin's and Raul's test of emptiness, depending whether I was coding a generalized utility, or solving a real-world problem. Which is not far off what Raul has just said. I guess my meaning of "empty" ought to be NuVoc's, which you can read in: http://code.jsoftware.com/wiki/Vocabulary/Glossary#Empty …i.e. "no atoms". Does it matter? A newcomer to J might be forgiven for thinking it's "Much Ado About Nothing", as someone posted earlier. I'd disagree. It's fundamentally important – and I mean "fundamentally" – all about foundations – not just a long word for "very". Was it Knuth who first identified the "null case" (…did he call it?) as a large, important and massively wasteful class of bug? Older programmers will point me at a good reference. It follows that NuVoc ought to have a big bold answer to questions about empty nouns. It doesn't. (At least, not bold enough). As a newcomer I'd expect to find: Vocabulary/EmptyNouns or /EmptyLists in: http://code.jsoftware.com/wiki/NuVoc#bottomrefs @Raul – if you're not going to write it, are you happy for me to do so, using what you've posted in this thread? It won't be for a week or two because I'm snowed under and I don't know why I'm volunteering for this. Out of embarrassment, maybe. Obligatory null-case joke (with apologies to Raul)… BANK MANAGER: Why did you write the IRS a check for $0-00? CUSTOMER: They said they needed it for the good of their system. BANK MANAGER: Whaddya think it's done to OUR system? On Fri, Jun 9, 2017 at 12:41 PM, Raul Miller <[email protected]> wrote: > I'm not sure I completely agree: > > i. 1 0 1 > 0 < # i. 1 0 1 > 1 > 0 < # 3 > 1 > > For the general case of emptiness, the reliable test would be 0 e. $ > > That said, checking for zero items (or more than zero items) is often > quite convenient. > > Thanks, > > -- > Raul > > > On Fri, Jun 9, 2017 at 7:36 AM, 'Pascal Jasmin' via Programming > <[email protected]> wrote: > > the reliable test for emptiness is (0 < #) > > > > > > > > > > ________________________________ > > From: Ian Clark <[email protected]> > > To: [email protected] > > Sent: Thursday, June 8, 2017 11:15 PM > > Subject: Re: [Jprogramming] Empty lists? > > > > > > > > Henry, I absolutely agree. > > > > Only last night I was thinking NuVoc lacked an in-depth treatment of > empty > > lists (/tables) – and how it was a serious omission. (It does have > > Vocabulary/EmptyArguments --which overlaps slightly.) > > > > Devon's treatment fits the bill. > > > > Might also need a reliable test for emptiness, to discourage use of: if. > y > > -: '' do. … > > > > On Fri, Jun 9, 2017 at 3:44 AM, Henry Rich <[email protected]> wrote: > > > >> This is great - would you be willing to add it to NuVoc? Perhaps as > >> Vocabulary/EmptyArrays? If you do, I'll point the main NuVoc page to > it. > >> > >> Henry Rich > >> > >> > >> On 6/8/2017 10:35 PM, Devon McCormick wrote: > >> > >>> J's treatment of empty arrays is thoroughly logical and consistent but > >>> it's > >>> probably more instructive to look at the shapes of results rather than > at > >>> the results themselves, since a lot of empty arrays "look" the same > though > >>> their shapes clearly differ: > >>> > >>> 0 0 0$99 NB. 3-D empty array > >>> 9 0 0$99 NB. 3-D empty array > >>> > >>> At the risk of obfuscating rather than clarifying, here are some > >>> progressions from non-empty to empty arrays - the point here is that > not > >>> all empty arrays are the same. Any array with zero as at least one of > its > >>> dimensions is empty but may have a different shape than another empty > >>> array. > >>> > >>> $i.2 NB. 2-element vec > >>> 2 > >>> $1}.i.2 NB. Drop 1 element from 2-element vec > >>> 1 > >>> $2}.i.2 NB. Drop 2 elements from 2-element vec > >>> 0 > >>> $3}.i.2 NB. Drop 3 elements from 2-element vec > >>> 0 NB. -> empty vector > >>> > >>> $i.2 2 NB. 2x2 mat > >>> 2 2 > >>> $1}.i.2 2 NB. Drop 1 row from 2x2 mat > >>> 1 2 > >>> $2}.i.2 2 NB. Drop 2 rows from 2x2 mat > >>> 0 2 NB. -> mat with no rows > >>> $3}.i.2 2 NB. Drop 3 rows from 2x2 mat > >>> 0 2 > >>> > >>> $1}."1 i.2 2 NB. Drop 1 column from 2x2 mat > >>> 2 1 > >>> $2}."1 i.2 2 NB. Drop 2 columns from 2x2 mat > >>> 2 0 NB. -> mat with no columns > >>> $3}."1 i.2 2 NB. Drop 3 columns from 2x2 mat > >>> 2 0 > >>> > >>> <'' NB. Boxed empty > >>> ++ > >>> || > >>> ++ > >>> $<'' NB. Boxed empty is a scalar > >>> > >>> '' -: $<'' NB. Boxed empty is a scalar > >>> 1 > >>> (i.0) -: $<'' NB. Boxed empty is a scalar > >>> 1 > >>> $,<'' NB. 1-element boxed empty > >>> 1 > >>> a: -: <'' NB. "Ace" is equivalent to boxed empty > >>> 1 > >>> > >>> 2$a: NB. 2-element vector of boxed empties > >>> +++ > >>> ||| > >>> +++ > >>> $2$a: NB. 2-element vector > >>> 2 > >>> $1}.2$a: NB. Drop 1 element from 2-element vector > >>> 1 > >>> 1}.2$a: NB. Drop 1 element from 2-element vector > >>> ++ > >>> || > >>> ++ > >>> $2}.2$a: NB. Drop 2 elements from 2-element vector > >>> 0 NB. -> empty vector > >>> '' -: 2}.2$a: NB. Empty vector > >>> 1 > >>> '' -: 2}. i.2 NB. Empty vector > >>> 1 > >>> '' -: 2}. i.2 2 NB. Not empty vector: 0x2 mat > >>> 0 > >>> (0 2$'hi') -: 2}. i.2 2 > >>> 1 > >>> > >>> Obligatory empty array joke: > >>> A man sits down in a diner and asks for coffee with no cream. The > >>> waitress replies, "I'm sorry, sir. We're out of cream. Would you like > >>> your coffee with no milk?" > >>> > >>> > >>> > >>> On Wed, Jun 7, 2017 at 1:03 PM, Michael Rice <[email protected]> > wrote: > >>> > >>> @robert therriault > >>>> > >>>> my_empty =: }. 1 > >>>> > >>>> my_empty > >>>> > >>>> > >>>> f my_empty > >>>> > >>>> 1 > >>>> > >>>> < my_empty > >>>> > >>>> ┌┐ > >>>> > >>>> ││ > >>>> > >>>> └┘ > >>>> > >>>> > >>>> An empty box? > >>>> > >>>> > >>>> I'm beginning to see the problem I was thinking of doing in J is > >>>> ill-suited > >>>> to the language. It could be done, as it could in any computer > language, > >>>> but the solution would be pretty kludgy. > >>>> > >>>> > >>>> I'll soon think of something else on which to apply J. It's already > >>>> invading my sleep. Going through exercises is no way to get into a > >>>> language. One needs a problem on which to focus it. I've been wanting > to > >>>> explore cryptography more deeply, and J seems ideal for it. > >>>> > >>>> > >>>> Thanks to all, > >>>> > >>>> > >>>> Michael > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> On Wed, Jun 7, 2017 at 12:01 PM, robert therriault < > >>>> [email protected]> > >>>> wrote: > >>>> > >>>> I'm going to look at these results through the lens of Shape ($) > >>>>> > >>>>> f =: (1&,) > >>>>> f 2 > >>>>> 1 2 > >>>>> $ f 2 NB. shape is 2 > >>>>> 2 > >>>>> f '' > >>>>> 1 > >>>>> $ f '' NB. shape is 1 > >>>>> 1 > >>>>> empty NB. it is a verb in my environment > >>>>> (i.0 0)"_ > >>>>> f empty > >>>>> f empty NB. result of two verbs and no arguments is just the two > verbs > >>>>> f empty 2 NB. this is where you expect to have a 1 returned > >>>>> > >>>>> $ f empty 2 NB. shape is 1 0 > >>>>> 1 0 NB. one line of no items means no display > >>>>> > >>>>> I think it is the second dimension of EMPTY as opposed to NULL that > is > >>>>> tripping you up. > >>>>> > >>>>> NULL=.'' > >>>>> $ NULL > >>>>> 0 > >>>>> EMPTY > >>>>> $EMPTY > >>>>> 0 0 > >>>>> EMPTY-:empty 1 > >>>>> 1 > >>>>> > >>>>> In answer to your most recent question Michael, I would say just make > >>>>> > >>>> sure > >>>> > >>>>> that the empty list that you pass is the right shape. > >>>>> > >>>>> Cheers, bob > >>>>> > >>>>> On Jun 7, 2017, at 8:48 AM, Raul Miller <[email protected]> > wrote: > >>>>>> > >>>>>> empty is a verb > >>>>>> f is a verb > >>>>>> > >>>>>> so f empty is a verb (a hook) > >>>>>> > >>>>>> f=: 1&, > >>>>>> (f empty) 3 > >>>>>> > >>>>>> > >>>>>> > >>>>>> $(f empty) 3 > >>>>>> 3 0 > >>>>>> $(f empty) 5 > >>>>>> 5 0 > >>>>>> > >>>>>> The reasons for this are documented at > >>>>>> http://www.jsoftware.com/help/dictionary/dictf.htm (hooks) and > >>>>>> http://www.jsoftware.com/help/dictionary/d630n.htm (x m&v y). > >>>>>> > >>>>>> That said, verbs take arguments and empty is a verb - it always > >>>>>> produces an empty result, but only when it gets an argument. > >>>>>> > >>>>>> I hope this helps, > >>>>>> > >>>>>> -- > >>>>>> Raul > >>>>>> > >>>>>> > >>>>>> On Wed, Jun 7, 2017 at 11:39 AM, Michael Rice <[email protected]> > >>>>>> > >>>>> wrote: > >>>>> > >>>>>> Oops! Guess I creamed empty. Will close and regen Jqt before > >>>>>>> > >>>>>> proceeding. > >>>> > >>>>> Done! > >>>>>>> > >>>>>>> f =: (1&,) > >>>>>>> f 2 > >>>>>>> 1 2 > >>>>>>> f empty > >>>>>>> f empty > >>>>>>> > >>>>>>> Shouldn't it have returned > >>>>>>> > >>>>>>> 1 > >>>>>>> > >>>>>>> ? > >>>>>>> > >>>>>>> On Wed, Jun 7, 2017 at 11:22 AM, robert therriault < > >>>>>>> > >>>>>> [email protected]> > >>>>> > >>>>>> wrote: > >>>>>>> > >>>>>>> One thing to remember is that empty is already defined as a verb > >>>>>>>> > >>>>>>>> empty > >>>>>>>> (i.0 0)"_ > >>>>>>>> > >>>>>>>> So if you overwrite this you may break some code if you have > >>>>>>>> > >>>>>>> previously > >>>> > >>>>> relied on the existing verb definition. > >>>>>>>> > >>>>>>>> I think along the lines that Pascal mentioned that null could be > >>>>>>>> > >>>>>>> similarly > >>>>> > >>>>>> defined as > >>>>>>>> > >>>>>>>> null NB. check that it is not already used > >>>>>>>> |value error: null > >>>>>>>> null=:(i.0)"_ > >>>>>>>> NULL NB. check that it is not already used - uppercase for > global > >>>>>>>> nouns is a convention I like and is often seen in J code > >>>>>>>> |value error: NULL > >>>>>>>> NULL=:'' NB. I use this as the null string (same as what John > >>>>>>>> > >>>>>>> suggested) > >>>>> > >>>>>> NULL-:null 2 NB. any argument produces NULL from null > >>>>>>>> 1 > >>>>>>>> > >>>>>>>> Hope this helps, > >>>>>>>> > >>>>>>>> Cheers, bob > >>>>>>>> > >>>>>>>> On Jun 7, 2017, at 8:09 AM, 'Jon Hough' via Programming < > >>>>>>>>> > >>>>>>>> [email protected]> wrote: > >>>>>>>> > >>>>>>>>> > >>>>>>>>> I may be wrong in doing this, but I usually write > >>>>>>>>> empty=: '' > >>>>>>>>> to signify an empty list, array, matrix etc. > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> On Jun 7, 2017, 23:59, at 23:59, Michael Rice < > [email protected]> > >>>>>>>>> > >>>>>>>> wrote: > >>>>>>>> > >>>>>>>>> Is there a special "noun" for an empty list? > >>>>>>>>>> > >>>>>>>>>> Creating one seems enigmatic. > >>>>>>>>>> > >>>>>>>>>> empty =: 1 2 > >>>>>>>>>> empty > >>>>>>>>>> 1 2 > >>>>>>>>>> empty =: }. empty > >>>>>>>>>> empty > >>>>>>>>>> 2 > >>>>>>>>>> empty =: }. empty > >>>>>>>>>> empty > >>>>>>>>>> > >>>>>>>>>> empty1 =: > >>>>>>>>>> |syntax error > >>>>>>>>>> | empty1=: > >>>>>>>>>> ------------------------------------------------------------ > >>>>>>>>>> > >>>>>>>>> ---------- > >>>>> > >>>>>> 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 > >>>>> > >>>>> ------------------------------------------------------------ > ---------- > >>>> 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 > >> > > ---------------------------------------------------------------------- > > 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
