Simple String Buffer

lua-users home
wiki

A simple way to avoid quadratic execution time when creating a string in pieces is to use a string buffer. The easiest way of doing this is to put the pieces into a table, and then concatenate them when you're done.

The following metatable generator makes this syntactically more interesting.

function stringbufFactory(default_sep)

  local meta = {}

  function meta:__div(sep)

    if getmetatable(self) ~= meta then self, sep = sep, self end

    return table.concat(self, sep)

  end

  function meta:__unm() return self / default_sep end

  function meta:__call(str) table.insert(self, str); return self end

  

  return function(...) return setmetatable(arg, meta) end

end

The simple strategy of always appending the new string chunk to a vector could be modified to use the Towers of Hanoi strategy, or some alternative.

Other possible enhancements include using a double-ended queue instead of a stack, to allow for concatenation on either side.

The metamethods were chosen to make assembly "look nice" (to me):


> L = stringbufFactory "\n"



-- This syntax won't work in the standalone interpreter, thus the do and end

> story = "It was a dark and stormy night, when nothing happened"

> do

Prose = -L 

   "The following story has been contributed:"

   "" (story)

   ""

   " -- 30 -- "

   ""

-- see the Lua Book for an explanation of the final ""

end



> =Prose

The following story has been contributed:



It was a dark and stormy night, when nothing happened



 -- 30 -- 



> -- This example will work fine in the standalone interpreter:



> C = stringbufFactory ", "

> vars1 = -C "a" "b" "c"



> S = stringbufFactory ""

> vars2 = ", " / S "a" "b" "c"

> -- or, depending on taste

> vars3 = S "a" "b" "c" / ", "

> =vars1

a, b, c

> =vars2

a, b, c

> =vars3

a, b, c




RecentChanges · preferences
edit · history
Last edited November 21, 2006 7:27 pm GMT (diff)