lua程序设计(第四版)练习答案自做(第二十五章)

25.1

#!/usr/bin/lua
function getvarvalue(...)
        local co=...
        if type(co)=="thread" then
                local name,level,isenv=select(2,...)
                local value
                local found=false
                level=level or 1
                for i=1,math.huge do
                        local n,v=debug.getlocal(co,level,i)
                        if not n then
                                break
                        end
                        if n==name then
                                value=v
                                found=true
                        end
                end
                if found then
                        return "local",value
                end
                local func=debug.getinfo(co,level,"f").func
                for i=1,math.huge do
                        local n,v=debug.getupvalue(func,i)
                        if not n then
                                break
                        end
                        if n==name then
                                return "upvalue",v
                        end
                end
                if isenv then
                        return "noenv"
                end
                local _,env=getvarvalue(co,"_ENV",level,true)
                if env then
                        return "global",env[name]
                else
                        return "noenv"
                end
        else
                local name,level,isenv=...
                local value
                local found=false
                level=(level or 1)+1
                for i=1,math.huge do
                        local n,v=debug.getlocal(level,i)
                        if not n then
                                break
                        end
                        if n==name then
                                value=v
                                found=true
                        end
                end
                if found then
                        return "local",value
                end
                local func=debug.getinfo(level,"f").func
                for i=1,math.huge do
                        local n,v=debug.getupvalue(func,i)
                        if not n then
                                break
                        end
                        if n==name then
                                return "upvalue",v
                        end
                end
                if isenv then
                        return "noenv"
                end
                local _,env=getvarvalue("_ENV",level,true)
                if env then
                        return "global",env[name]
                else
                        return "noenv"
                end
        end
end

25.2

#!/usr/bin/lua
function setvarvalue(name,value,level)
        level=(level or 1)+1
        for i=1,math.huge do
                local n,v=debug.getlocal(level,i)
                if not n then
                        break
                end
                if n==name then
                        debug.setlocal(level,i,value)
                        return "local"
                end
        end

        local func=debug.getinfo(level,"f").func
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n==name then
                        debug.setupvalue(func,i,value)
                        return "upvalue"
                end
        end
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n=="_ENV" then
                        v[name]=value
                        return "global"
                end
        end
end

25.3

#!/usr/bin/lua
function getvarvalue()
        local res={}
        local level=2
        local env
        for i=1,math.huge do
                local n,v=debug.getlocal(level,i)
                if not n then
                        break
                end
                res[n]=v
        end
        local func=debug.getinfo(level,"f").func
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n=="_ENV" then
                        env=v
                end
                res[n]=v
        end
        if env then
                res.__index=env
                setmetatable(res,res)
        end
        return res
end

25.4

#!/usr/bin/lua
function getvarvalue(_,name,level,isenv)
        local value
        local found=false
        level=(level or 3)+1
        for i=1,math.huge do
                local n,v=debug.getlocal(level,i)
                if not n then
                        break
                end
                if n==name then
                        value=v
                        found=true
                end
        end
        if found then
                return value
        end
        local func=debug.getinfo(level,"f").func
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n==name then
                        return v
                end
        end
        if isenv then
                return "noenv"
        end
        local env=getvarvalue(nil,"_ENV",level,true)
        if env then
                return env[name]
        else
                return "noenv"
        end
end
function setvarvalue(_,name,value,level)
        level=(level or 3)+1
        for i=1,math.huge do
                local n,v=debug.getlocal(level,i)
                if not n then
                        break
                end
                if n==name then
                        debug.setlocal(level,i,value)
                        return "local"
                end
        end
        local func=debug.getinfo(level,"f").func
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n==name then
                        debug.setupvalue(func,i,value)
                        return "upvalue"
                end
        end
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n=="_ENV" then
                        v[name]=value
                        return "global"
                end
        end
end
function debug1()
        while true do
                io.write("debug> ")
                local line=io.read()
                if line=="cont" then
                        break
                end
                local env={print=print,__index=getvarvalue,__newindex=setvarvalue}
                setmetatable(env,env)
                load(line,"testcode","t",env)()
        end
end

25.5

#!/usr/bin/lua
function getvarvalue(_,name,level,isenv)
        local value
        local found=false
        level=(level or 3)+1
        for i=1,math.huge do
                local n,v=debug.getlocal(level,i)
                if not n then
                        break
                end
                if n==name then
                        value=v
                        found=true
                end
        end
        if found then
                return value
        end
        local func=debug.getinfo(level,"f").func
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n==name then
                        return v
                end
        end
        if isenv then
                return "noenv"
        end
        local env=getvarvalue(nil,"_ENV",level,true)
        if env then
                return env[name]
        else
                return "noenv"
        end
end
function setvarvalue(_,name,value,level)
        level=(level or 3)+1
        for i=1,math.huge do
                local n,v=debug.getlocal(level,i)
                if not n then
                        break
                end
                if n==name then
                        debug.setlocal(level,i,value)
                        return "local"
                end
        end
        local func=debug.getinfo(level,"f").func
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n==name then
                        debug.setupvalue(func,i,value)
                        return "upvalue"
                end
        end
        for i=1,math.huge do
                local n,v=debug.getupvalue(func,i)
                if not n then
                        break
                end
                if n=="_ENV" then
                        v[name]=value
                        return "global"
                end
        end
end
function debug1()
        while true do
                io.write("debug> ")
                local line=io.read()
                if line=="cont" then
                        break
                end
                local env={print=print,__index=getvarvalue,__newindex=setvarvalue}
                setmetatable(env,env)
                load(line,"testcode","t",env)()
        end
end

25.6

待完善

25.7

local breakpoint={}
local function hook(event,line)
        if breakpoint[line] then
                debug.debug()
        end
end
local function setbreakpoint(func,line)
        breakpoint[line]=true
        if not debug.gethook() then
                debug.sethook(hook,"l")
        end
        return line
end
local function removebreakpoint(handle)
        breakpoint[handle]=nil
end
return {
        setbreakpoint=setbreakpoint,
        removebreakpoint=removebreakpoint,
}

25.8

待完善

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值