On Jul 8, 2011, at 9:46 AM, Bob Sneidar wrote:

Ic. Well if it worked that way, then there would be no point in declaring it's scope (forgive me if that is not the right term) to begin with, as all variables would only have one "scope" that being global. Maybe I'm not getting it.

Bob

Here is a detailed description that most people won't care to read, but you asked, so here goes :-)

There are many scopes that you can create.
When declaring a global, you are defining that variable as belonging to Livecode (if in the development environment) or the standalone app. The programming rule should be that you don't want to create the ambiguity that let's the script engine decide which scope you mean. Since it is very easy to accidentally use the same name for variables in different namespaces, it far better to avoid this by being disciplined in your coding. This is true in any programming language.

If it helps, think of namespaces as separate tables on a spreadsheet.
One table is named
  global variables of this app  (either LC or a standalone)
   --   eg      gCupHolder, gDateString, gUserName

script locals of the SCRIPT of button "Run This" of card 2 of this stack
  --     pathNamesArray, repeatLoopCount, currHilitedLine

  script locals of the SCRIPT of card "January Data" of this stack
  --  accountingSummary, currentMonth

local variables of the HANDLER "processData" of the script of this stack
  -- loopCounter, shortCardId, imgID

local variables of the HANDLER "getDateAsJulian" of the script of card 5 of this substack
  -- loopCounter, shortCardId, imgID

Each of these 'tables' or namespaces can have a variable named 'cupHolder' and it can have different contents. LC is most capable of keeping all of these accurate, neat, and tidy... but there are rules.

To access a LC global or an operating system global (those starting with $ such as $USER $HOME $SHELL ) you need to use
   global gCupHolder,
 in the script container before using these in your script
(but you don't have to declare the $USER or $HOME since they can only be system globals) A global can be declared but if is is not used, the Variable Watcher will not show it. Once it is used by any script, it gets created ( if it does not exist) and is global to any scripts that run in that environment. The scripting you write must declare that you want to access the global namespace.

-- options for declaring are ---
*1*  as a top line in a script
*2* as a line in the script container that is not in a handler or function

{handlers in this container}
global cupHolder
on processData
    ...
end processData

*3* as a line inside a handler, but before the first time you use it in that handler
-- note: avoid    global cupHolder   inside a repeat loop

on processData
   global cupHolder
end processData
--------------------------
to use cupHolder as a SCRIPT local scope variable use
local cupHolder
at the top of a script container
--------------------------
to use cupHolder as a HANDLER local scope variable use
 any statement to create the variable
  eg
on processData
    put "morning coffee" into cupHolder

*4*  in the message box
typing "global gAAA" will create this global name for all stacks and scripts

NOTE: The message box can access globals without declaring them first... just refer to them
    eg..     put gCupHolder & the seconds

-----
The programming rule should be that you don't want to create the ambiguity that let's the script engine decide which scope you mean. Since it is very easy to accidentally use the same name for variables in different namespaces, it far better to avoid this by being disciplined in your coding. This gets much trickier if you pass parameters and try to use those names as well.

 on processData monthlyTotals, workerHours, officeCode, cupHolder
-- now these 4 parameters are HANDLER locals and will vanish at the end of this handler
end processData

Hope this helps you figure it out.


Jim Ault
Las Vegas



_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to