Programming In Lua Exercises

lua-users home
wiki

These are community contributed solutions to some of the PiL3 exercises.

Chapter 3

Exercise 3.4

-- Recursive solution; the basic idea is to keep factoring out x until

-- we reach a 0 level polynomial:

--

--   3x^3 + 2x^2 + x + 3

-- = (3x^2 + 2x + 1) * x + 3

-- = (((3x + 2) * x) + 1) * x + 3

-- = ((((3 * x) + 2) * x) + 1) * x + 3

--

-- N.b. this algorithm requires that there be no gaps in the series of

-- coefficients. If there is no exponent for a particular power then the

-- coefficients list must contain a 0.



function poly (coefficients, x)

    size = #coefficients

    if size < 0 then

	print ("Error: algorithm requires positive coefficients")

    elseif size == 0 then 

        return 0

    else

	c = coefficients[size]

	coefficients[size] = nil

        return c + x * poly(coefficients, x) 

    end

end



print (poly({4,3,0,1}, 10))	-- gives 4301

Exercise 3.5

-- The key is on p.22: lua returns false for comparisons between different

-- types, so only a boolean (or a nil) will return true when compared to true

-- or to false. 



function test (candidate)

    print (candidate == true or candidate == false)

end



candidates = {5, 0, "hello", {2,3,4}, true, false}



-- gives false, false, false, false, true, true

for k, v in pairs(candidates) do

    print (test(v))

end



Chapter 8

Exercise 8.4

Can you find any value for f such that the call pcall(pcall,f) returns false as its first result?

Using the debug library ([source]):

local f = function()

  local h = function()

    if c then debug.sethook(nil,"r") end

    c = not c

    error()

  end

  debug.sethook(h,"r")

end

pcall(pcall,f)

Another idea is to have the extra "true" added by the inner pcall overflow the call stack ([source]).


RecentChanges · preferences
edit · history
Last edited March 6, 2013 7:00 pm GMT (diff)