Programming In Lua Exercises |
|
-- 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
-- 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
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]).