Thanks Pascal. This approach is completely different to mine. I can't really comment on your verbs without running them through the dissector, which won't happen until tomorrow, unfortunately. But I will have a look. By the way, I agree with your point about it not being the dictionary's responsibility to "know" what it's values are. Which is kind of the problem. If I am trying to serialize a dictionary and the serializer goes through each value and asks "what type are you?", any boxed literal could be lying, if there is an object whose object reference boxed literal looks identical. And if the boxed literal looks like the reference to the actual parent dictionary, then the whole thing blows up. For a language like C# and Java when you don't know what you're looking at, you can at least tryGetType(), or instanceof, or even TryParse(value), which are all really helpful for (de)serializing data. I'm finding my method difficult mainly because there doesn't seem to be a J equivalent.
> Date: Fri, 1 May 2015 13:31:13 +0000 > From: [email protected] > To: [email protected] > Subject: Re: [Jprogramming] Datatype of an Object > > Here is a set of functional functions for working with a dictionary. the y > arg is the dictionary, x is what you want to get out or put in. > > As a point of philosophy, it is not up to the dictionary to care what it > stores. The user of the dictionary is expected to manage what is inside, and > the user can greatly simplify such management by imposing his own > restrictions/uniformity for what goes inside a specific dictionary. > > The dictionary does need to make sure that it behaves consistently with 0 1 > and many items. > > kvgi =: #@:{.@:] _:`]@.> (<@:[ i.~ (0&{@:]))"1 _ > kvgix =: #@:{.@:] _:`]@.> ([ i.~ (0&{@:]))"0 _ > kvgv =: >@:((1&{@:]) {~ <@:[ i.~ (0&{@:]))"1 _ :: empty > kvgk =: >@:((0&{@:]) #~ >@: (+./L:0) @:([ e.~ L:0 (1&{@:])))"0 _ :: empty > kvlabel =: <@:[ , <@:] > > scalarize =: {.^: ((,1) -: $) > amend_z_ =: 2 : 0 NB. v is n or n{"num > s=. v"_ y > (u (s{y)) (s}) y > : > s=. v"_ y > (x u (s{y)) (s}) y > ) > > kvadd =: 4 : 0 NB. add appends value if some exist for key > if. 0=# y do. kvlabel&>/ x return. end. > i=. ({.x) kvgix y =. (,.`]@.(2=#@$)) y > if. _=i do. y ,."_ 1 x else. ,&(> scalarize }. x) each amend (<1,i) y end. > ) > kvset =: 4 : 0 NB. set replaces value. empty start ok. > if. 0=# y do. kvlabel&>/ x return. end. > i=. (> {.x) kvgi y =. (,.`]@.(2:=#@$)) y [ d=. (> scalarize }.x) > if. _=i do. if. 0<# d do.y ,."_ 1 x end. else. if. 0<# d do. d"_ each amend > (<1,i) y > else. (i{."1 y) ,"1 (>:i)}."1 y end. end. > ) > > kvadd will append an item to a key, while kvset replaces a key setting > > ] a=. (2 ;< 18!:3 '') kvset (1 ; < 18!:3 '') kvadd (1 ; < 18!:3 '') kvset > '' > +-------+----+ > |1 |2 | > +-------+----+ > |+--+--+|+--+| > ||12|13|||14|| > |+--+--+|+--+| > +-------+----+ > > > > 1 kvgv a > +--+--+ > |12|13| > +--+--+ > > > As a user of a dictionary, I need to manage dealing with potential lists of > objects only if I can cause them by what I put in. I bring my own function > (BYOF should be a thing) to deal with it, and 18!:0 is probably the best > initial screener. > > The big advantage of dealing with dictionaries functionally, is that you have > a simple list of 2 rows of boxes that you can manipulate any other way you > want. Instead of manipulating them with a series of kvadd/kvset commands, > you can parse a structured 0 : 0 noun to set it up, or filter items (say > those that include objects) from a larger dictionary. > > A dictionary that contains other dictionaries: > > (3 ; < a) kvset a > +-------+----+--------------+ > |1 |2 |3 | > +-------+----+--------------+ > |+--+--+|+--+|+-------+----+| > ||12|13|||14|||1 |2 || > |+--+--+|+--+|+-------+----+| > | | ||+--+--+|+--+|| > | | |||12|13|||14||| > | | ||+--+--+|+--+|| > | | |+-------+----+| > +-------+----+--------------+ > > As a user, a dictionary that can contain more than 3 types of things would be > a mess to handle, and would be advised to store the type of thing as well as > the item if you really wanted to structure your storage that way. > > But one way to recognize a dictionary in the above is that it is a 2xn shaped > boxed structure. For most applications I can think of, it would be sensible > to not place non-dictionary 2xn boxed structures into "the" dictionary. But > another way to distinguish between matrixes of boxes (that could have 2 rows) > and dictionaries, is to place another boxing level around them (turning a > matrix into a scalar boxed item) , and so can use boxing level as a > distinguisher of item kinds. > > > ----- Original Message ----- > From: Jon Hough <[email protected]> > To: "[email protected]" <[email protected]> > Cc: > Sent: Friday, May 1, 2015 8:04 AM > Subject: Re: [Jprogramming] Datatype of an Object > > The problem is, I am working on a J hashmap/dictionary implementation. And > there seems little point if the hashmap can not contain another hashmap as a > value. But if it does contain such a value, it becomes necessary to be able > to differentiate it from just an ordinary boxed literal. > Using a GetType style of verb is a partial solution, but I wonder if I just > so happen to add a key value pair to my dictionary where the value is a boxed > literal that happens to have exactly the same look as another dictionary > object I have lying around. This could screw a lot of things up, because > GetType would and could interpret this value as the object, even though it > has nothing to do with it. This could actually screw everything up. Anyway, > it's the solution I'm using until I can find something better. > One workaround I am thinking of as I type (may not make sense), is to add all > created dictionaries to an array somewhere and reference everything from that > array. Then, somehow, if I add a key/value pair to my parent Dictionary, > where the value is another dictionary, the actual value to store could be an > index of the array, instead of the actual dictionary object. > > Regards,Jon > > > From: [email protected] > > Date: Fri, 1 May 2015 07:43:40 -0400 > > To: [email protected] > > Subject: Re: [Jprogramming] Datatype of an Object > > > > The other way is to structure your data so you know what you are working > > with. > > > > For example, maintain a parallel structure with the "type information" > > that you want to be tracking here. > > > > Thanks, > > > > -- > > Raul > > > > On Fri, May 1, 2015 at 1:26 AM, Jon Hough <[email protected]> wrote: > > > This seems to be the easiest solution: > > > > > > > > > GetType =: 3 : 0 > > > > > > > > > > > > try. > > > > > > > > > > > > 0{ 18!:2 y > > > > > > > > > > > > catch. datatype y end. > > > > > > ) > > > > > > > > > > > > > > > I don't like the idea of relying on an error to branch the output, but I > > > don't know any other way and this seems to output exactly what I need. > > > Thanks all. > > > > > >> Date: Fri, 1 May 2015 10:18:38 +0800 > > >> From: [email protected] > > >> To: [email protected] > > >> Subject: Re: [Jprogramming] Datatype of an Object > > >> > > >> use 18!:0 to test for locale name. eg. > > >> 18!:0 <'foo' > > >> > > >> Пт, 01 май 2015, Jon Hough написал(а): > > >> > Thanks, > > >> > It seems 18!:2 is more or less what I need. > > >> > However, it gives an error for Boxed literals. I think I will need > > >> > to wrap my verb in a try catch and if itcatches an error I know I am > > >> > dealing with a standard J type. > > >> > > > >> > You may be wondering why I would get myself intoa situation where I > > >> > mistake a boxed literal for an object, but I am creating data > > >> > structures thatare arrays of both Objects and standard J types. So I > > >> > need to inspect each item in the structureto see if it is a boxed > > >> > variable or an object. > > >> > > > >> > > Date: Thu, 30 Apr 2015 21:06:01 -0400 > > >> > > From: [email protected] > > >> > > To: [email protected] > > >> > > Subject: Re: [Jprogramming] Datatype of an Object > > >> > > > > >> > > You could look at the path of the object, with > > >> > > > > >> > > 18!:2 Obj > > >> > > > > >> > > Since the path is under the control of the user, you would have to > > >> > > know > > >> > > what you do with the path to be able to make sense of it. Often, the > > >> > > first atom in the path would tell you what you are looking for. > > >> > > > > >> > > > > >> > > > > >> > > An object (called a 'numbered locale' in the J docs) is not a boxed > > >> > > integer: it's a boxed string that contains all numberics. You could > > >> > > check for that with > > >> > > > > >> > > isnumloc =: *./@:e.&'0123456789'@> > > >> > > > > >> > > Henry Rich > > >> > > > > >> > > (Note that it is an error for the first character of a numbered > > >> > > locale > > >> > > to be '0'). > > >> > > > > >> > > > > >> > > On 4/30/2015 8:57 PM, Jon Hough wrote: > > >> > > > It seems of I have an Object,e.g.Obj =: conew 'MyClass' > > >> > > > And later I want to get the type of Obj > > >> > > > datatype Obj > > >> > > > this returns "boxed", which is technically correct, but it seems > > >> > > > datatype lacks the introspection to look beneath the box at the > > >> > > > object. > > >> > > > So is there a way to get the type (i.e. class name if possible) of > > >> > > > an object? > > >> > > > e.g. I have some variable Q (which happens to be an instance of > > >> > > > MyClass).Is there a way to create a verb, getTypeOf, such that > > >> > > > getTypeOf Q > > >> > > > returns 'MyClass' > > >> > > > I couldn't find anything in JForC on this. At the moment I am > > >> > > > finding it difficult to differentiate boxedintegers from objects. > > >> > > > ---------------------------------------------------------------------- > > >> > > > 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 > > >> > > >> -- > > >> regards, > > >> ==================================================== > > >> GPG key 1024D/4434BAB3 2008-08-24 > > >> gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3 > > >> gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3 > > > >> ---------------------------------------------------------------------- > > >> 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
