0

_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);'); 
4

1 回答 1

2

你得到“尝试调用一个 nil 值”,因为loadstring返回nil(所以你pcall用调用nil)。 loadstring返回 nil 因为您正在编译的代码 ( __predecessor) 包含无效的 Lua:

_ENV = {
    chorda.sub = chorda.sub -- can't do this
}

仅供参考: loadstring/pcall 的东西与你的问题无关。如果您在发布之前将其剥离,您自己会发现此错误。

于 2013-01-09T23:04:32.777 回答