_ENV和Lua中的类不兼容。

_ENV 目前不支持使用类。我试图创建一种拉丁风格的 Lua,但有些东西不能完全使用 _ENV 实现,但更高效。setfenv 也不太合作。

下面的代码不断返回旧的 attempt to call a nil value 错误。它指定了第 20 行,在检查 loadstring() 时,以及第 23 行,在主块中调用 __latin() 函数。

function __latin(code)
    __predecessor = [===[
    function typographia(value)
        print(value);
    end

    chorda = {};
    chorda.__index = chorda;

    function chorda.sub(chorda, cChorda, fChorda)
        return string.sub(chorda, cChorda, fChorda);
    end
    function chorda:sub(chorda, cChorda, fChorda)
        return string.sub(chorda, cChorda, fChorda);
    end

    --[[ define values --]]
    _ENV = {salve="Salve, munde!",typographia=typographia,print=print,chorda=chorda,chorda.sub=chorda.sub};  ]===];
    __finalizer = __predecessor .. " " .. code;
    local status, err = pcall(loadstring(__finalizer));
    print(err);
    if (err == nil) then loadstring(__finalizer)(); end
end
__latin('typographia(salve); chorda.sub(salve, 1, 3);');
点赞
用户501459
用户501459

你得到了 "尝试调用零值" 的错误,因为 loadstring 返回了 nil(所以你正在使用 nil 调用 pcall)。loadstring 返回 nil 是因为你正在编译的代码(__predecessor)包含无效的 Lua 代码:

_ENV = {
    chorda.sub = chorda.sub -- 无法执行此操作
}

FYI:loadstring/pcall 技术与你的问题无关。如果你在发帖前 删除了它,你就可以自己发现这个错误。

2013-01-09 23:04:32