1. (6 points) Show how to write the following piece of XML as a short string and as a long string:
<![CDATA[
Hello World
]]>Answer:
"<![CDATA[\n Hello World\n]]>"
[=[<![CDATA[
Hello World
]]>]=]2. (6 points) After running a = {}; a.a = a, what is the
value of a.a.a.a? If we now do a.a.a.a = 3, what is the
value of a.a.a.a?
The same as a.
It is an error, because a.a is now 3.3. (6 points) Write a function that receives an arbitrary number of values and returns all of them, except the first one.
function drop1(x, ...)
return ...
end4. (12 points) Write a function poly that takes a polynomial represented
as an array of coeficients and returns a function that takes a
parameter x and evaluates the polynomial for x. For example:
f = poly({3, 0, 1})
print(f(0)) -- 1
print(f(5)) -- 76Answer:
function poly(cs)
return function(x)
local sum = 0
local power = #cs - 1
for _, c in ipairs(cs) do
sum = sum + c * (x ^ power)
power = power - 1
end
return sum
end
end5. (15 points) Write a function fibs that returns a closure iterator
that produces the first n numbers
of the Fibonacci sequence (1, 1, 2, 3, 5, 8, 13, …). For example:
s = 0
for i in fibs(5) do
s = s + i
end
print(s) -- 1 + 1 + 2 + 3 + 5Answer:
function fibs(n)
local a = 1
local b = 1
return function ()
if n == 0 then return end
local next = a
a, b = b, a + b
n = n - 1
return next
end
end6. (6 points) Suppose the value of package.path is .\?.lua;c:\Lua52\libs\?.lua;c:\Lua52\libs\?\init.lua.
What files will Lua try to load if we do require "mypack.mymod"?
.\mypack\mymod.lua
c:\Lua52\libs\mypack\mymod.lua
c:\Lua52\libs\mypack\mymod\init.lua7. (6 points) Is the operation == always commutative in Lua? Explain.
No, because the __eq metamethod may not implement a commutative operation.8. (15 points) Write an Iterator class that takes a closure iterator
in its constructor. Objects of the Iterator class have a next method
that returns the next element produced by the closure iterator.
local Iterator = {}
Iterator.__index = Iterator
function Iterator:new(iter)
return setmetatable({ iter = iter }, self)
end
function Iterator:next()
return self.iter()
end9. (6 points) Assume the Lua stack is empty. What will be its contents after the following sequences of calls in a C function?
lua_pushstring(L, "foo");
lua_pushnil(L);
lua_pushvalue(L, -2);
lua_pushnumber(L, 5);
lua_remove(L, 1);
lua_insert(L, -2);Answer:
From bottom to top:
nil 5 "foo"10. (10 points) A web server uses a Lua configuration file like the one below.
Assume that the configuration file has already been loaded. Write the C code that
extracts the configuration values from the Lua state, and writes them to variables
addr_ip, addr_port, and http_root on the C side.
address = { ip = "*", port = 8080 }
root = "/var/www"Answer:
lua_getglobal(L, "address");
lua_getfield(L, -1, "ip");
strcpy(addr_ip, lua_tostring(L, -1));
lua_pop(L, 1);
lua_getfield(L, -1, "port");
addr_port = lua_tointeger(L, -1);
lua_getglobal(L, "root");
strcpy(http_root, lua_tostring(L, -1));11. (6 points) Write a C function that receives an arbitrary number of values and returns all of them, except the first one.
static int drop1(lua_State *L) {
int nargs = lua_gettop(L);
if(nargs > 0)
return nargs - 1;
else
return 0;
}12. (6 points) Write the Lua code that corresponds to the sequence
of Lua VM instructions below. Assume that register 0 is the local
variable a, register 1 is b, and register 2 is c.
NEWTABLE R0 R0 R0
SETTABLE R0 R1 R2
GETTABLE R1 R0 R1Answer (void):
a = {}
b[c] = a
b = a[b]