Goodbye stsMLXEditor

Mark Wieder mwieder at ahsoftware.net
Wed Sep 2 21:54:34 EDT 2015


On 09/02/2015 12:38 PM, Peter Haworth wrote:
> Assuming the errors you are referring to are of the "undeclared variable"
> type, I have a utility that inserts local statements for any undeclared
> variables.  Maybe I should offer it to the team.

A number of reasons why this isn't a good idea.
But there's a function for it in the glx2 script editor as well.

The late Eric Chatonet and I had a great conversation with Jerry Daniels 
where we talked about why not to do this (and in the process almost had 
him convinced to use explicitVars)... I finally said something like I 
could maybe stomach it if the function grouped variables by theme, 
keeping like variables together, but that it was beyond what computers 
were capable of.

The next morning Eric emailed an algorithm that did just that, and we 
tweaked it over the next few hours and came up with a function that 
would group variables very nicely. It does rely on CamelCase variable 
names, but that's the only restriction. Posted here for your amusement. 
Watch the line wrap - it's deadly.


/**
glx2GetSortedVars
Eric Chatonet's contribution:
Sort a CamelCase variable list thematically
pVarList is a list of variables to sort, one per line
*/
function glx2GetSortedVars pVarList

     local tVar, tChar, tFound, tNumOfChars, tVarList
     local tDeclaration
     local tStart, tEnd
     local tLength

     if pVarList is not empty then
         set the itemdelimiter to comma
         repeat for each line tVar in pVarList
             if IsCaps(char 2 of tVar) then
                 delete the first char of tVar --CamelCase notation
             end if
             -- We don't care about trailing digits
             repeat until the last char of tVar is not an integer -- 
incremented vars
                 delete the last char of tVar
             end repeat

             -- get the length of the variable name
             put the number of chars of tVar into tNumOfChars
             put tNumOfChars into tEnd

             -- Gather a list of words
             -- Relies on CamelCase notation: capitalized words will end 
up on this list
             -- tHorizontalOffset will put Horizontal and offset into 
the list
             repeat with tStart = tNumOfChars down to 1 -- unfortunately 
repeat for each can't be used
                 -- if we have found the start of a word
                 -- (make sure we're not looking at just the last char 
of the word)
                 put tEnd - tStart into tLength
                 if IsCaps(char tStart of tVar) and tStart < tNumOfChars 
then
                     -- if we've already found a keyword in this 
variable name
                     if IsCaps(char tEnd of tVar) then --
                         if char tStart to tEnd - 1 of tVar is not among 
the items of tFound and tStart is not tEnd - 1 then
                             if tLength > 2 then
                                 put char tStart to tEnd - 1 of tVar & 
comma before tFound
                             end if
                         end if
                     else
                         -- This is the first keyword we've found in 
this variable name
                         -- if we don't have this word in our list yet
                         if char tStart to tEnd of tVar is not among the 
items of tFound then
                             -- add it to the list
                             if tLength > 2 then
                                 put char tStart to tEnd of tVar & comma 
after tFound
                             end if
                         end if
                     end if
                     put tStart into tEnd
                 end if
             end repeat -- with i = tNumOfChars down to 1
         end repeat -- for each line tVar in pVarList

         -- now work our way through the list
         repeat for each item tWord in tFound
             put pVarList into tVarList
             filter tVarList with "*" & tWord & "*"
             filter pVarList without "*" & tWord & "*"
             if tVarList is not empty then
                 sort tVarList
                 -- group similar items onto the same line
                 replace cr with comma & space in tVarList
                 put the cIndent of me & "local" && tVarList & cr after 
tDeclaration
             end if
         end repeat

         -- if there's anything left in pVarList at this point then
         -- we want to be sure to add it. This covers the case of variables
         -- not in CamelCase notation.
         put 1 into tNumOfChars
         repeat for each line tLine in pVarList
             if tNumOfChars is 1 then
                 put the cIndent of me & "local " after tDeclaration
             end if
             put tLine after tDeclaration
             add 1 to tNumOfChars
             -- See if we've put four variables on this line already
             if tNumOfChars is 4 then
                 put cr after tDeclaration
                 put 1 into tNumOfChars
             else
                 put comma after tDeclaration
             end if
         end repeat
         if char -1 of tDeclaration is comma then
             put cr into char -1 of tDeclaration
         end if
         sort tDeclaration

         -- end with a delimiter to separate the automatically-generated 
declarations
         -- from any declarations previously entered by the user
         -- This will help identify problem declarations
         put the cIndent of me & "-----" after tDeclaration
         put the cIndent of me & "-----" & cr before tDeclaration
     end if
     return tDeclaration
end glx2GetSortedVars

-- 
  Mark Wieder
  ahsoftware at gmail.com




More information about the use-livecode mailing list