Correct Syntax???!!!

Richard Gaskin ambassador at
Fri Mar 24 13:11:32 EST 2006

David Burgun wrote:

> The reason for this is that around 2 years ago  
> when I first started using RunRev, I saw an initialization handler  
> (in one of the Sample Stacks that came with RunRev)  that did:
> put empty into me
> So I used this form from then on and the 99.99% solution got  
> replicated over and over again!

Right. While your specific setup did manage to discover a bug, perhaps 
the reason no one's reported this before is that they prefer to write 
less code.

Replicated code not only takes more time to write, but as you note it 
takes more time to revise.  Even if you were using something that worked 
perfectly, there may come a time when you want to enhance it. 
Replicated code means replicating the enhancement effort.

In common practice "me" is rarely used, as it only affects one object. 
In the example shown above, a more generalized approach might be this 
card script:

   on preOpenCard
       repeat with i = 1 to the number of flds
         if the lockText of fld i is false then
            put empty into fld i
         end if
       end repeat
       pass preOpenCard
   end preOpenCard

That simple handler accomodates any number of fields without 
modification to the code or the objects.  You can add or delete fields 
at any time, and the form still clears itself before being displayed.

Now suppose we later decide we want to have some fields to display 
default values, while still leaving others blank.  We could add a simple 
property to any field that needs it, and we only make a small change in 
that one card handler:

   on preOpenCard
       repeat with i = 1 to the number of flds
         if the lockText of fld i is false then
            put the uDefaultValue of fld i into fld i
         end if
       end repeat
       pass preOpenCard
   end preOpenCard

I read your outline at 
and although after two readings I can't figure out what its goal is my 
hunch is that it could be satisfied with a single backScript or library 
and property settings in affected objects.

Such an approach keeps the code centralized, making it easier to write, 
maintain, and enhance.  Objects could be added or removed from the 
behavioral management by just changing a property, never needing to even 
open a script editor.

There's also a performance benefit to using the natural message path 
whenever practical.  Consider these benchmarks from a simple test case* 
(times shown are per call):

Native:  0.007ms
Send:    0.011ms
Do:      0.013ms

In a single call, the difference between native message inheritance and 
"send" is only 0.004ms, certainly not worth worrying about.  But if one 
were building a system in which "send" is being used throughout as the 
primary means of driving things, the aggregate cost of that 50% 
peformance difference may make the system noticeably less responsive. 
Those clock cycles could probably be put to better use; even if 
performance appears fine for now, future enhancements may require 
additional load elsewhere, so it's often a good idea to keep performance 
in mind even when it doesn't initially seem important.

There are of course times when "send" and "do" are the only way to solve 
a problem, but with the flexibility of frontScripts, libraries, and 
backScripts such cases are few.

  Richard Gaskin
  Managing Editor, revJournal
  Rev tips, tutorials and more:

* Test scenario:

One stack, one card, one button with this script:

on mouseUp
   put 10000 into n
   put the millisecs into t
   repeat n
   end repeat
   put (the millisecs - t)/n into t1
   put the millisecs into t
   repeat n
     send "doMe" to this cd
   end repeat
   put (the millisecs - t )/n into t2
   put the millisecs into t
   repeat n
     do "doMe"
   end repeat
   put (the millisecs - t)/n into t3
   set the numberformat to "0.000"
   put "Native: "& t1 &"ms" &cr\
       &"Send:   "&t2 &"ms" &cr\
       &"Do:      "&t3 &"ms"
end mouseUp

The card script has this script, just dummy stuff as some arbitrary 
thing to do so we don't have an empty handler:

on doMe
   get "nothing"
   put "nothing" into it
end doMe

Times shown above were on a PowerBook G4 1GHz.

More information about the Use-livecode mailing list