When talking about mutable strings, he says that Lua's immutable strings make reading a file "quadratic and [...] prohibitively slow for even files of a few kilobytes.", which is demonstrably false. Sure, if you read a byte, nondestructively append a byte to what you've read, looping through anything, then you're screwed, in any language.* Large files should be read a line, a block, a megabyte, etc. at a time, anyway, though - the IO call overhead will dominate otherwise, no matter what you do.<p>* Joel Spolsky calls this "Shlemiel the painter" behavior. Difference lists are another direct solution for this, but not many languages have them.<p>He notes that, "Lua offers a facility, table.concat, to alleviate this problem; but it still bites programmers on occasion.", but using table.concat for large strings is both 1) one of the first things mentioned about working with strings in PiL (including explaining why doing appends naively is quadratic), and 2) incredibly common, so it's really not an issue in practice.<p>In my experience, having immutable and interned strings is usually a net win, even if they're a second data type (Lisp and K call them symbols, Erlang and Prolog call them atoms, etc.). Lua merges string, atoms, and raw byte arrays into the same type (albeit with a cute trick for large strings), but it also has the C API as an easy escape hatch.