Reverse a list

Peter M. Brigham pmbrig at gmail.com
Tue Feb 17 03:23:58 CET 2015


On Feb 16, 2015, at 9:05 PM, Dr. Hawkins wrote:

> On Mon, Feb 16, 2015 at 3:08 PM, Alex Tweedly <alex at tweedly.net> wrote:
> 
>> That's not quite correct. It doesn't do a single initial complete scan of
>> the whole variable and keep all the pointers. What it does is (more like)
>> keep track of how far it has currently processed, and then when it needs
>> the next line, it scans from that remembered position forward until the
>> next CR - and then remembers that as the current position.
> 
> 
> And if you repeat for each item, and change the itemDel in the loop, you
> had *better* remember to change it back before end repeat, or very strange
> things happen . . .

No need to change the itemdel in a loop, you can use this instead:

put getItem(pList, pIndex, pDelim) into tItem

-- Peter

Peter M. Brigham
pmbrig at gmail.com
http://home.comcast.net/~pmbrig

-----

function getItem pList, pIndex, pDelim
   -- returns item # pIndex of pList, given itemdelimiter = pDelim
   -- could just "get item pIndex of pList" in the calling handler but
   --    then have to set and restore the itemDelimiter, so this is less hassle
   -- defaults to pDelim = tab
   -- allows pDelim to be a string of characters
   --    so you could do this:
   --    getItem("a//b//c//d//e//f",4,"//") -> d
   -- also allows pIndex to be a range, eg "3-5"
   --    in that case enclose the range in quotes
   -- by Peter M. Brigham, pmbrig at gmail.com — freeware
   
   -- requires getDelimiters()
   
   if pDelim = empty then put tab into pDelim
   put getDelimiters(pList) into tempDelim
   if tempDelim begins with "Error" then return "Error in getDelimiters()"
   replace pDelim with tempDelim in pList
   set the itemdelimiter to tempDelim
   put offset("-",pIndex) into dashPos
   if dashPos > 1 then
      -- don't catch if pIndex is something like -1, -2, etc
      put char 1 to dashPos-1 of pIndex into tStart
      put char dashPos+1 to -1 of pIndex into tEnd
      put item tStart to tEnd of pList into theItem
      replace tempDelim with pDelim in theItem
   else
      put item pIndex of pList into theItem
   end if
   return theItem
end getItem

function getDelimiters pText, nbr
   -- returns a cr-delimited list of <nbr> characters
   --    not found in the variable pText
   -- use for delimiters for, eg, parsing text files, loading arrays, etc.
   -- usage: put getDelimiters(pText,2) into tDelims
   --        if tDelims begins with "Error" then exit to top -- or whatever
   --        put line 1 of tDelims into lineDivider
   --        put line 2 of tDelims into itemDivider
   --             etc.
   -- by Peter M. Brigham, pmbrig at gmail.com — freeware
   
   if pText = empty then return "Error: no text specified."
   if nbr = empty then put 1 into nbr -- default 1 delimiter
   put "2,3,4,5,6,7,8,16,17,18,19,20,21,22,23,24,25,26" into baseList
   -- low ASCII values, excluding CR, LF, tab, etc.
   put the number of items of baseList into maxNbr
   if nbr > maxNbr then return "Error: max" && maxNbr && "delimiters."
   repeat with tCount = 1 to nbr
      put true into failed
      repeat with i = 1 to the number of items of baseList
         put item i of baseList into testNbr
         put numtochar(testNbr) into testChar
         if testChar is not in pText then
            -- found one, store and get next delim
            put false into failed
            put testChar into line tCount of delimList
            exit repeat
         end if
      end repeat
      if failed then
         if tCount = 0 then
            return "Error: cannot get any delimiters."
         else if tCount = 1 then
            return "Error: can only get one delimiter."
         else
            return "Error: can only get" && tCount && "delimiters."
         end if
      end if
      delete item i of baseList
   end repeat
   return delimList
end getDelimiters





More information about the use-livecode mailing list