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
>



-- 

Devon McCormick, CFA

Quantitative Consultant
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to