Understanding 'the defaultStack'

Mark Waddingham mark at livecode.com
Tue Oct 11 05:01:46 EDT 2016


On 2016-10-09 22:25, Jeanne A. E. DeVoto wrote:
> At this point, I'm starting to wonder whether the defaultStack should
> be redesigned/re-specced to make it more predictable.
> 
> I don't think it's feasible to actually make major changes in the way
> the defaultStack works, but possibly a new property could be designed
> that acts in such a way that workarounds like this aren't normally
> needed. Setting and re-setting the defaultStack to make sure it's
> right is almost as annoying as specifying the stack every time you
> refer to an object (which I sometimes do anyway, for fear of the
> defaultStack changing from under me).
> 
> If it were being designed from scratch, what would the ideal behavior
> be for a targetStack property? Should it remain unchanged while a
> script is running (unless set explicitly)?

I don't think its even possible to add a new property which works 
'better' (by some metric) as the defaultStack is what is used to 'fill 
in' missing stack references in chunk expressions - thus its 
defaultStack, or something else, but not both (otherwise there's no way 
for the engine to know whether you want to use the new fangled 
targetStack for that purpose, or the old fashioned defaultStack for that 
purpose - in any one case).

I wonder if there are just some cases in the current behavior which need 
some review and refinement - in particular, the scope of the changes to 
the defaultStack.

One thing to consider is what the locality of a change should be. In 
particular:

   1) If the defaultStack is changed in a handler, should it remain that 
way for all subsequent commands (which don't explicitly change the 
defaultStack) and should the change recurse into called functions and 
commands?

   2) If the defaultStack is changed in a handler called from another 
handler, should the change propagate back up to the caller?

I think (1) is definitely wanted. If you have changed the defaultStack 
in a handler, then it makes sense that anything executed within that 
handler, and any handlers invoked within it should use that context.

I think (2) is definitely not wanted. If the locality of a change to the 
defaultStack propagates back to callers, then the callers loose control 
and knowledge of what they are actually acting on.

If changes propagate down, and not up then all we need to do is mark 
commands which explicitly change the defaultStack as doing so. e.g.

   1) go stack tStack - open stack tStack and set the defaultStack to it

   2) set the defaultStack to tStack - set the defaultStack to tStack

   3) send tMessage to tObject - execute tMessage in the context of 
tObject, setting the defaultStack to the stack of tObject for the 
duration of the handler

   4) call tMessage to tObject - execute tMessage of tObject, leaving the 
defaultStack untouched

With that in mind then the proposed 'using' clause would basically just 
be a local push / pop of the defaultStack:

   using stack "foo"
     ...
   end using

Would be equivalent to:

   put the defaultStack into tOldDS
   set the defaultStack to "foo"
   ...
   set the defaultStack to tOldDS

Anyway, the above is just a suggestion (on the whole) - I'm not sure the 
above to rules (i.e. defaultStack changes propagate into callees, not 
back into callers) necessarily model the current usage that well or not. 
However, they are (at least) relatively easy to write down and 
understand (?).

Warmest Regards,

Mark.

-- 
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps





More information about the use-livecode mailing list