18!:0 y checks the status of y when viewed as a locale-name. Unfortunately if y is totally bogus as a locale-name, 18!:0 fails with rank/domain/whatever error.

[Jon, if you add a request to system/interpreter/requests to remind me, I will modify 18!:0 to return _3 for malformed locale rather than the error.]

This is where (u :: v) is useful.  It is a verb that executes u returning its result, except that if u fails, the verb executes v and returns the result of that.

So here, 18!:0 :: _3: is saying 'is y a locale?  and if you get an error, just return _3.'  Remember _3: is a verb that always returns _3, same as _3"_ .

Henry Rich

On 7/9/2018 10:57 PM, 'Jon Hough' via Programming wrote:
Yes, you are correct, thanks:

    1 = 18!:0 :: _3: n__child
0
    1 = 18!:0 :: _3: m__child
0
1 = 18!:0 :: _3: other__child
1
Seems to work fine!
Although, in this case, I am not entirely sure what _3: does.  What exactly
is it doing? Nuvoc doesn't seem to have any example using it.

Thanks,
Jon
--------------------------------------------
On Tue, 7/10/18, Henry Rich <[email protected]> wrote:

  Subject: Re: [Jprogramming] Test whether class member is primitive
  To: [email protected]
  Date: Tuesday, July 10, 2018, 11:52 AM
It looked to me that using 1 = 18!:0 :: _3: would solve your problem. Henry Rich On 7/9/2018 10:50 PM, 'Jon Hough' via
  Programming wrote:
  > Sorry for the lack
  of clarity. The answer is yes, a boxed numbered locale.
  > Please see my last email (you may have
  missed it because we seemed to have sent at about the same
  time.)
  > My contrived example shows the
  root of the problem.
  >
  > You are correct that this method is
  fragile, but I don't know any other method.
  > Mixing up a boxed number locale with a
  boxed string of digits should never be an
  > issue with any of my classes. If a
  variable is a boxed string of digits then it is safe to
  assume
  > it as a locale.
  >
  > Anyway, my previous
  email gave a specific example of when this problem occurs,
  and what I
  > need to do to fix it to some
  extent.
  >
  > Thanks,
  > Jon
  >
  --------------------------------------------
  > On Tue, 7/10/18, Henry Rich <[email protected]>
  wrote:
  >
  >   Subject:
  Re: [Jprogramming] Test whether class member is primitive
  >   To: [email protected]
  >   Date: Tuesday, July 10, 2018, 11:36
  AM
  >
  >   Is an
  'object' a boxed
  >   numbered
  locale?  This is a yes-or-no question,
  >   and I think you are saying
  'yes', but I
  >   want to be
  sure.
  >
  >
  Perhaps
  >   you should use 18!:0 ::
  _3:   ?
  >
  >
  You will always have the problem of
  >
  distinguishing a boxed string of
  >
  digits
  >   from a locale-name.
  >
  >   Looking
  >   at the path is a bad idea and
  fragile.  Paths may be
  >   changed
  or
  >   set to empty based on the
  >   programmer's needs.
  >
  >   Henry Rich
  >
  >   On
  >   7/9/2018 10:16 PM, 'Jon Hough'
  via Programming
  >   wrote:
  >   > By "object" i mean
  >   some variable instantiated with conew -
  not a J type.
  >   > I am writing an
  object serializer, and
  >   looked at
  >   > https://code.jsoftware.com/wiki/Scripts/Serialization
  >   >
  >   > A
  modified version of
  >   this works
  somewhat, but it has problems  with
  >
  >   if. a: -: c=. {.(copath ::(a:"_)
  >   y)-.<,'z' do.
  >   > ...
  >   >
  else.
  >   > ...
  >   > end.
  >
  >
  >   > the above test is to check
  whether some
  >   variable is an object
  or a J type.
  >   > It
  >   fails on some of my classes for the
  reasons I explained in
  >   my last
  email.
  >   >
  >
  > It
  >   seems 18!:0 works for the
  case I gave, but in general will
  >   not
  work,
  >   > e.g. if m__myOtherClass
  =:
  >   1
  >   >
  18!:0 < m__myOtherClass
  >   > will
  give an rank error.
  >   >
  >   > The serializer I am
  >   writing is 90% complete. It just fails
  when an object's
  >   primitive
  member
  >   > variable is inherited
  >   from a parent class. Then my serializer
  thinks the member is
  >   an object type,
  because
  >   > the primitive
  >   test,
  >   > a:
  -: c=. {.(copath ::(a:"_)
  >
  y)-.<,'z'
  >   > fails.
  >   >
  >   >
  >   >
  >   >
  >
  --------------------------------------------
  >   > On Tue, 7/10/18, Henry Rich <[email protected]>
  >   wrote:
  >   >
  >   >   Subject:
  >   Re: [Jprogramming] Test whether class
  member is primitive
  >   >   To: [email protected]
  >   >   Date: Tuesday, July 10, 2018,
  10:56
  >   AM
  >
  >
  >   >   I
  >   don't understand the term
  >   >
  >
  'object'.
  >   >
  >   >   Does that
  >   >   mean
  >
  'numbered locale'?  If so, then a test for
  >   >   objectness
  >   >
  >   would
  be
  >   >
  >
  >   1
  >   = 18!:0
  >   >
  >   >
  >   >   Henry Rich
  >   >
  >   >
  On
  >   >   7/9/2018
  >   9:41 PM, 'Jon Hough' via
  Programming
  >   >   wrote:
  >   >   > I
  >
  want to test if a given member
  >
  >
  >   variable of an object is
  primitive  (e.g. one of the J
  >
  >   datatypes - literal, integer etc etc)
  >   or an object.
  >
  >   >
  >   >   >
  coclass
  >   >
  >
  'MyClass'
  >   >   >
  >   >   >
  >
  >   create=: 3
  >   : 0
  >   >   > m=:
  >   >
  >
  'something'
  >   >   >
  )
  >   >   >
  >   >   >
  >
  >   >
  >   >   Here is
  >   one method:
  >
  >   >
  >   >   > myClass
  =: '' conew
  >   >
  'MyClass'
  >   >   >
  a: -:  {. (copath
  >   >   ::(
  a:"_) m__myClass) -. <,
  >
  'z' NB. return 1
  >   >
  if
  >   primitive, 0 if an object.
  >   >   >
  >
  >   > This works, except if the member
  >   is
  >   >
  defined in a parent class.
  >   >
  >
  >   >   >
  >   coclass 'MyOtherClass'
  >   >   >
  >
  coinsert 'MyClass'
  >   >
  >
  >   >   > create=: 3 : 0
  >   >   > create_MyClass_ f.
  ''
  >   >   >
  ''
  >   >
  >   > )
  >   >
  >
  >   >
  >
  >
  >   >   >
  >   >
  >
  myOtherClass =: '' conew 'MyOtherClass'
  >   >   >   a: -:  {. (copath
  ::(
  >   a:"_)
  >   >   m__myOtherClass) -. <,
  >   'z'
  >
  >   >
  >   >   >
  >   >   >
  >
  >   the above returns 0, but member is a
  >   primitive member of the
  >   >   MyOtherClass
  >   instance. Ideally this
  >   >   >
  >
  >   should return 1 in this case, since m
  >   is still a primitive
  >   >   member of
  >   MyOtherClass.
  >
  >   >
  >   >   > Any
  better way to test for
  >   primitive
  >   >   members?
  >   >   >
  >
  >   >
  >   >   Thanks,
  >   >   >
  >
  Jon
  >   >   >
  >   >
  >
  ----------------------------------------------------------------------
  >   >   > For information about J
  forums see
  >   http://www.jsoftware.com/forums.htm
  >   >
  >   >
  >   >   ---
  >
  >   This email
  >   has been checked
  for viruses by
  >   >
  >   AVG.
  >   >
  https://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
  >
  >
  >   ---
  >   This email
  has been checked for viruses by
  >
  AVG.
  >   https://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
---
  This email has been checked for viruses by
  AVG.
  https://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


---
This email has been checked for viruses by AVG.
https://www.avg.com

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

Reply via email to