Lua 实现 eval 和 lambda

43 views
Skip to first unread message

sagasw

unread,
Aug 7, 2009, 12:27:29 AM8/7/09
to lu...@googlegroups.com
主要思想就是使用loadstring函数进行处理
代码如下:

function eval(str)
    if type(str) == "string" then
        return loadstring("return " .. str)()
    elseif type(str) == "number" then
        return loadstring("return " .. tostring(str))()
    else
        error("is not a string")
    end
end

function lambda(lambda_string,argument)
--验证是否仅存在一个:号
    pos = string.find(lambda_string,":")
    if pos ~= nil then
        if string.find(lambda_string,":",pos+1)~= nil then
            error('more than one ":"')
         end
    end
    if type(lambda_string) ~= "string" then
        error("is not a string")
    end
    --lambda x:x+x 将其分割为 参数 x 和 表达式 x+x 的形式
    parameter = string.sub(lambda_string,1,pos-1)
    expression = string.sub(lambda_string,pos+1,-1)
    --根据需要可以更详细的对参数进行验证,这里就不做了
    fun = string.format("return function(%s) return %s end",parameter,expression)
    print (fun)
    func = loadstring(fun)()(loadstring("return " .. tostring(argument))())
end


--直接返回值的测试
t = loadstring("return 134")
print(t)
--上边的loadstring返回的是一个function,需要加()才可以调用
print(t())
t = loadstring("return 134")()
print(t)
--定义一个非匿名函数,直接调用
t = loadstring("function xxx(a) return a end return xxx('this is a function test')")()
print(t)
--定义匿名函数,然后调用
t = loadstring("return function(a) return a end")()
print(t("this is a test"))
--验证eval函数
print(eval("111,333"))
print(eval("111+333*2"))
print(eval("134+34*1224>1"))
--这里的表达式,lua首先自己进行计算,然后再传入eval函数
print(eval(134+34*1224))
--验证lambda函数
t = lambda("x,y:print(x+y)","7,8")
t = lambda("x:print(x*134)",14)

Reply all
Reply to author
Forward
0 new messages