Again with the start using.

Richard Gaskin ambassador at fourthworld.com
Wed Mar 3 14:44:50 EST 2004


Dar Scott wrote:

> On Wednesday, March 3, 2004, at 10:32 AM, Richard Gaskin wrote:
> 
>> Given that a library should always perform those two checks anyway (to 
>> see if it is the target of the message and whether it's been 
>> initialized already), what is the downside to passing that system 
>> message just as one would usually want to pass all others?
>
> Do you mean in all cases?

I don't know that anything in programming lends itself to absolutes. :)

> Is it really a consensus that certain messages, such as openCard, should 
> pass down the path?  What are those messages?

I picked up the habit of passing system messages from an old book, 
"Tricks of the HyperTalk Masters", and possibly from Thimbleby and 
Colouris' "HyperTalk Programming" (my copy was loaned out many years 
ago, and as happens with many good books it's never come back, and is 
long since out of print).

It proved useful in those days because I would often want to augment 
behavior for an event and found, as those writers suggested, that as 
long as I passed my system messages I'd left an open door to do that. 
Without passing system messages the door is closed, until you write a 
worm to go back and revise the scripts of the objects whose behavior you 
want to change, easier done in one's office than throughout an installed 
based.

But of course, the difficulty is that to rely on messages being passed 
requires that everyone play ball; great for your own team but impossible 
to depend on for libraries designed for use in other people's 
environments.  A lot of the code bases I work on today were inherited, 
mostly ports from other systems, so there are few assurances of 
stylistic consistency.

The solution to this came in 1994 when SuperCard introduced 
frontScripts, allowing you to trap system messages before any other 
object gets them.  This was added to MetaCard not long after.  There are 
rare cases in which it may be especially useful to get the messages 
after the target is done with them, but for the most part frontScripts 
are the optimal choice for trapping system messages in other people's 
environments.

In a frontScript, it is almost always essential that all messages always 
be passed; there may be an exception worth honoring, but in general if 
you don't pass system messages in a frontScript the result will be 
undesirable, as not even the target will get them.

In my own stuff I tend to pass all card- and stack-related messages 
everywhere, and  often don't bother with the "mouse" messages in 
not-frontScript objects.

The libraryStack message is a bit of a Schroedinger's Cat, since on the 
one hand you may want to preserve the native state of things, but on the 
other hand the native state of things doesn't include your stack which 
is the reason that instance of the libraryStack message is sent.  But 
continuing down the rabbit hole, maybe it's a case of "sum ergo passo" 
("I exists, therefore I pass"), in which the existence of the stack in 
the message queue may just as well be seen as a "natural" thing, and 
therefore any outside script monitoring such things should rightfully 
expect the libraryStack message to be comin' down the pike (though I'd 
be surprised if someone writing something so exotic wouldn't prefer the 
greater reliability of a frontScript).

But just as Schroedinger's Cat is an unnecessarily complicated 
discussion for a relatively simple idea, so is that last paragraph. :)

As much as rational minds strive for absolutes, I think a lot of nuances 
surrounding when to pass system messages depend on what you're working 
on and your own personal comfort zone.

Here, when something works I use it, and when it no longer works I write 
a worm. :)  I always pass everything in any script I write for global 
access (frontScripts, backScripts, libraries), and discriminate based on 
contextual considerations in non-shared objects.


As a relevant side note, many messages the IDE relies on are handled in 
backScripts like revGeneral, where you'll find handlers for things like 
the powerful selectedObjectChanged message.  If you're making a drawing 
app and don't pass that message the IDE will not function; this may be a 
downside for those getting started but offers a convenience for pros in 
being able to override IDE behaviors without having to first remove IDE 
scripts from the message path.  As much as I appreciate that convenience 
myself, I would probably make the pros work a little harder if it would 
help protect newcomers, so I wonder if Rev has considered migrating 
those handlers to a frontScript going forward.

-- 
  Richard Gaskin
  Fourth World Media Corporation
  ___________________________________________________________
  Ambassador at FourthWorld.com       http://www.FourthWorld.com


More information about the use-livecode mailing list