[Laszlo-dev] Is this the idiom people use to set the initial value of an attribute in a class declaration?

John Sundman jsundman at laszlosystems.com
Tue Oct 9 16:52:17 PDT 2007


Here's a thread from this summer about class variables.

Below, PTW says, "It's a weak spot in the implementation right now  
that Henry and I hope to repair as we modernize the tag compiler."

Will this be addressed as part of the refactoring of the tag compiler  
now ongoing, or should I plan to document around this?

Thanks,

jrs



On Jul 9, 2007, at 12:09 PM, P T Withington wrote:

> Er, not.
>
> All our attributes are instance attributes.  If you leave out  
> $once, you get a micro-optimization if the initial value is a  
> constant, and you get something you probably did not want otherwise.
>
> It's a weak spot in the implementation right now that Henry and I  
> hope to repair as we modernize the tag compiler.
>
> On 2007-07-09, at 09:12 EDT, Elliot Winard wrote:
>
>> I always assumed that, unless $once{} was used, I was declaring a  
>> static attribute.  I thought that was noted in the docs.
>>
>> Maybe not?
>> -e
>>
>>
>> On Mon, Jul 9, 2007 at  7:55 AM, P T Withington wrote:
>>
>>> The bug we have is that we don't treat every instance initializer  
>>> as an expression, so you can't say `value="new Array"` to get  
>>> around the sharing, you have to say `value="${new Array}"`.  I  
>>> think this is an FAQ that Antun covers.
>>>
>>> And yes, you are right.  This would be solved by moving attribute  
>>> initializers into the class initializer.
>>>
>>> But if we fix this bug, we'll need to provide a way to share in  
>>> the cases where you _do_ want to share, perhaps by providing an  
>>> LZX way to declare a static attribute?
>>>
>>> On 2007-07-08, at 22:25 EDT, Henry Minsky wrote:
>>>
>>>> I've been hacking on an app this week, and realizing it's been  
>>>> awhile since
>>>> I tried
>>>> to actually program anything in Laszlo.
>>>>
>>>> There's this huge "gotcha" when setting the initial value of  
>>>> attributes to
>>>> an object in a class
>>>> declaration, like this
>>>>
>>>>
>>>> <class name="foo">
>>>>  <attribute name="pets" value="[]"/>
>>>>
>>>> Which screws you since that object will now be shared among all  
>>>> instances.
>>>>
>>>> The idiom I think I remember people using is
>>>>
>>>> <class name="foo">
>>>>  <attribute name="pets" value="$once{[]}"/>
>>>>
>>>> Or more readably
>>>>
>>>> <class name="foo">
>>>>  <attribute name="pets" value="$once{new Array()}"/>
>>>>
>>>> Is that what we recommend to do now? I guess we going to  
>>>> quietly  fix this
>>>> issue if and when we get
>>>> our node initialization rewritten as a compile-time-generated  
>>>> initializer
>>>> function?
>>>>
>>>>
>>>> -- 
>>>> Henry Minsky
>>>> Software Architect
>>>> hminsky at laszlosystems.com
>>
>>
>> ---=---===-------
>> Elliot Winard
>> Sr. Software Engineer
>> Webtop Team
>> ---=---===-------
>



More information about the Laszlo-dev mailing list