[Laszlo-user] proposal for new behavior of compiler when declaring child nodes with same name as attributes

jamesr circlecycle at gmail.com
Mon Jun 2 11:01:38 PDT 2008


I have the same issues in a project I was working in but tried to  
solve it by having subspaces so that, say, the View->Box->Window  
inherited class chain have their attributes in the View.x, Box.x, and  
Window.x namespaces.

That wasn't too smooth for compositional uses and i hadn't proceeded  
further. Since it doesn't happen all that much, you're right, i like  
what you've done.  Thanks for taking the time to write it out for us.

-james


On Jun 2, 2008, at 11:21 AM, P T Withington wrote:

> Surely you want to be warned if you are tromping on one of the  
> attributes of your superclass?
>
> LZX has always only had one namespace.  But it used to have 3  
> separate lists of 'initial arguments' to constructors:
>
> 1) simple initial values
> 2) constraints
> 3) styles
>
> even though these different initial values were all specified in the  
> same place in an attribute.
>
> This was an unending source of bugs, because people were constantly  
> discovering that when they subclassed a class, overriding an initial  
> argument of one kind with another kind never worked the way you  
> expected.  (E.g., if your superclass constrained an attribute and  
> you tried to set it to a constant, your superclass would win!  The  
> work-around was for you to constrain the value in your subclass to a  
> constant value.)  And each of these lists was treated differently  
> when they supplied an initial value for an attribute that had a  
> setter!
>
> Now we have a single initial arguments list, and overriding works as  
> expected.  But also, the processing of values for attributes with  
> setters is uniform.  This should be a good thing, but revealed a  
> gray area in the language.  What did it mean to have a child node  
> with the same name as an attribute?  What if that attribute has a  
> setter?  Or is processed specially by the class construct method?
>
> To Henry and I, it seems like trying to use the same name for an  
> attribute and a child node ought to be an error.  But, if you  
> _really_ want this, we give you an out.  You can declare your  
> attribute to be of type node, and when the child is created, it will  
> be stored in the attribute (using the setter if there is one).
>
> On 2008-06-02, at 10:25 EDT, jamesr wrote:
>
>> It's not that I disagree with the proposal, but in a way I mourn  
>> the passing of simpler namespacing. It seems like the orthgonal  
>> namespaces increase complexity of the run time, and part of me  
>> wants to see that complexity managed by framework authors - i.e.  
>> using prefixed names for reserved words so that layout becomes  
>> lzLayout. It's not that the proposal is bad from a CS standpoint,  
>> but that it steepens the learning curve of how laszlo works. It  
>> seems to me that telling people that what names you see from  
>> inspecting a node is what populates your namespace (like a typical  
>> object), not that some conflict and some don't based on an  
>> implementation you don't see.
>>
>> However this is just philosophy and not pragmatism. If this  
>> proposed feature works stably and doesn't cause problems, it's hard  
>> to argue against it.
>>
>> -j
>>
>> On Jun 2, 2008, at 8:38 AM, P T Withington wrote:
>>
>>> I think this is a good proposal, since it should actually be  
>>> pretty rare that you want to declare an attribute that ends up  
>>> being one of your child nodes.
>>>
>>> On 2008-05-28, at 13:24 EDT, Henry Minsky wrote
>>>
>>>> Sorry my message got cut off before I could finish it:
>>>>
>>>> This is a proposal in response to this bug, which came up when  
>>>> someone named
>>>> a child view "layout", and got
>>>> unexpected results in a view.
>>>>
>>>> http://jira.openlaszlo.org/jira/browse/LPP-5799
>>>>
>>>> The current compiler behavior is that it will allow you to  
>>>> declare a child
>>>> with the same name as an attribute,
>>>> as long as the attribute has a null default value. This  
>>>> unfortunately
>>>> applies to virtually every attribute
>>>> declared in the schema, so in practice you can easily shadow all  
>>>> sorts of
>>>> important properties in
>>>> a view or node, by naming a child view with the same name as a  
>>>> class
>>>> attribute, with no warning from the compiler.
>>>>
>>>> This proposal is that we add a new LZX attribute type, "node",  
>>>> which you can
>>>> use to declare that
>>>> an attribute name can have the same name as child node.
>>>>
>>>> So for example you could have
>>>>
>>>> <class name="myclass">
>>>> <attribute name="titleview" type="node"/>
>>>>
>>>> <handler name="oninit">
>>>>    this.titleview.setAttribute('bgcolor', 0xcccccc);
>>>> </handler>
>>>> </class>
>>>>
>>>> Then elsewhere you could say
>>>>
>>>> <myclass>
>>>>  <view name="titleview">
>>>>    ....
>>>> </myclass>
>>>>
>>>> And the compiler would not complain.
>>>>
>>>> The existing compiler  behavior would be changed so that for any  
>>>> attribute
>>>> type
>>>> except "node",  if you name a child node
>>>> with the same name as that  attribute, you get a compiler warning,
>>>> regardless of
>>>> whether the attribute was declared with a default value.
>>>>
>>>>
>>>>
>>>> Henry Minsky
>>>> Software Architect
>>>> hminsky at laszlosystems.com
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.openlaszlo.org/pipermail/laszlo-user/attachments/20080602/244ed758/attachment.html


More information about the Laszlo-user mailing list