So, here I am trying to further my metaobject protocol library. In  
order to get further with it, I tried the eat-my-own-dog-food approach  
and decided to - after having written a MOP for POJOs - to try and  
write actual MOP implementations for some dynamic language  
implementations, most notably, Jython and JRuby.

And pretty soon, I hit an obvious design problem (which is okay,  
really - this is still an exercise in exploring the right approach).  
Namely, lots of languages actually have two namespaces when it comes  
to accessing data belonging to an object. I'll refer to one of them as  
"attributes" (as that's what they're called in both Ruby and Python)  
and the other are "items", which are elements of some container  
object. All objects have attributes, but only some objects  
(containers) have items.

Some languages don't make a distinction, most notably, JavaScript. In  
JavaScript, all objects are containers and they only have items (and  
an item can be a function, in which case it functions as a method on  
the object). Can't get much more generic than that, right? Other  
languages (Ruby, Python) will distinguish between the two; the  
containers are arrays/lists and hashes/dictionaries/maps. As a matter  
of fact, it helps thinking of Java as having the distinction -  
JavaBeans properties are the attributes, and arrays, Maps, and Lists  
will have items.

I'd like to think that most people's mental model of objects actually  
distinguishes the two. This of course, just as everything else I say  
here, is open to debate (and I'd actually welcome a good debate to  
iron things out).

Now, to make matters a bit more complicated, in lots of languages the  
container API is actually just a syntactic sugar. Give an object a []  
and a []= method, and it's a container in Ruby! Give it __getitem__,  
__setitem__, and few others, and it's a container in Python! Honestly,  
this is okay - as a byproduct of duck typing, one shouldn't expect  
there be any sort of an explicit declaration of "containerness", right?

Bottom line is, I feel this is a big deal to solve in interoperable  
manner, as the raison d'ĂȘtre of the MOP would be to allow  
interoperability between programs written in different languages  
within a single JVM; I imagine in most cases the programs will pass  
complex data structures built out of lists and dictionaries to one  
another, so it feels... essential to get this right. It also feels  
like something that can rightfully belong in a generic MOP as most  
languages do have the concept of ordered sequences and associative  
arrays. Of course, I might also be wrong here; it is also an essential  
goal to not end up with a baroque specification that contains  
everything plus the kitchen sink. I.e. you might notice that my  
current MOP effort for now doesn't have a concept of the class, as not  
all languages have a class concept; funnily enough the concept of  
sequences and maps actually looks more important for interop (since  
it's more general) to me right now than the concept of a class.

So, here am I wondering whether this is something that can be made  
sufficiently unified across the languages to the point that if a Ruby  
program is given a Python dictionary, and it calls []= on it, it  
actually ends up being translated into a __setitem__ call. The goal  
seems worthwhile, and is certainly possible but I'm not entirely sure  
how much of an effort will it take. There's only one way to find out  
though (doing it), but I'd really appreciate some debate and feedback  
here before I embark on this.

Thanks,
   Attila.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "JVM 
Languages" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/jvm-languages?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to