lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


 > Here's a first attempt at a splitting gmatch: [quoted below]

Not bad but I think you return the extra position matched by the
final ().  Mostly harmless.

You can also ditch the coroutines and simply do

    return function() return aux(gm()) end


Norman


 > function string.gmatchsplit(text, pattern)
 >     local gm = text:gmatch("()" .. pattern .. "()")
 >     local start = 1
 >     local function aux(...)
 >         if start == nil then
 >             return nil
 >         end
 >         local caps = select('#', ...)
 >         if caps == 0 then
 >             local finalpart = text:sub(start)
 >             start = nil
 >             return finalpart
 >         end
 >         local stop = (...) - 1
 >         local before = text:sub(start,stop)
 >         start = select(caps, ...)
 >         return before, select(2, ...)
 >     end
 >     return coroutine.wrap(
 >         function()
 >             while true do
 >                 coroutine.yield( aux(gm()) )
 >             end
 >         end
 >     )
 > end
 > 
 > for part in string.gmatchsplit("one<delim>two<delim>three", "<delim>") do
 >    print(part)
 > end