Lua eval实现

因为loadstring总是在全局环境中编译它的串,所以编译出的函数访问的变量是全局变量。为了避免污染全局环境我们需要用setfenv修改函数的环境

function eval(equation, variables)
    if(type(equation) == "string") then
        local eval = loadstring("return "..equation);
        if(type(eval) == "function") then
            setfenv(eval, variables or {});
            return eval();
        end
    end
end

使用:

local str = "200+lv*10+growth*0.1"

local val = eval(str, {lv = 3, growth = 100})

print(val)--240

时间: 2024-09-30 13:37:27

Lua eval实现的相关文章

运维流程系统

一 图论概述 1 图的分类 1 无向图 图 graph由顶点和边组成,顶点的又穷非空集合为V,边的集合为E,记做G(V,E)顶点vertex,数据元素的集合,顶点的集合,又穷非空,边edge,数据元素关系的集合,顶点关系的集合,可以为空,边分为有向和无向两种 无向边记做(A,B),或者(B,A),使用小括号 无向图,记做undirected Graph 无向边的边构成的图,G=(V,E),V={A,B,C,D},E={(A,B),(A,C),(B,C),(B,D),(C,D)} 2 有向图 有向

【Lua】Lua + LWT + ExtJS构建目录树

Lua处理后台逻辑,Lua lwt搭建后台程序,ExtJS根据后台传来的json数据构建目录树. 前台html和ExtJS代码不用多讲,直接上代码: treePanel.html 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4 5 <title>ExtJS TreePanel</

【Lua】LWT后台用JSON与 ExtJS传递数据

要完成目录树的构建,需要前台ExtJS构筑页面,后台处理逻辑,中间由JSON传递数据. 首先搭建后台环境: 1 require "httpd" 2 require "lfs" 3 4 request, args = ... 5 6 local s = {root = { 7 text = "rootNode", 8 expanded = true, 9 children = { 10 { 11 text = 'book1', 12 leaf =

《Redis设计与实现》学习笔记-Lua脚本

Redis从2.6开始支持Lua脚本,和事务的功能类似,可以通过Lua脚本原子的执行多个Redis命令.Redis提供了EVAL和EVALSHA命令执行lua脚本. 创建并修改Lua坏境 Redis在服务器内嵌了一个Lua坏境,并进行了一系列的修改,从而确保这个Lua坏境可以满足Redis服务器的需要,通过下列步骤创建并修改Lua坏境: 创建一个基础Lua坏境,通过调用Lua的C API函数lua_open. 载入多个函数库到Lua坏境中,让Lua脚本可以使用这些函数来进行数据操作.包括Lua核

Redis 的 Lua 脚本支持

Redis 2.6.0 内置的Lua Script支持,可以在Redis的Server端一次运行大量逻辑. 整个Script默认是在一个事务里的. Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key. EVAL每次传输一整段Script比较费带宽,可以先用SCRIPT LOAD载入script,返回哈希值.然后用EVALHASH执行. 内置的LUA库里还很贴心的带了CJSON,可以处理JSON字符串. 参考:http://www.searchdata

Lua 与 Redis

Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis - 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.li

如何将lua移植到arm平台的linux内核

将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的,于是自己研究了下,现将它分享出来. 移植到arm平台,主要是要重新实现setjmp和longjmp两个函数,网上相关的资料很少,最后终于找到一个klibc的项目,里面有setmp和longjmp的arm平台的实现,于是直接拿来用了,不用说,当看到脚本在内核中执行并打印出"hello,world&q

redis lua script 相关

脚本的执行是原子性的,当某个脚本正在运行的时候,不会有其他脚本或redis命令被执行. 这意味着运行一个缓慢的脚本并不是一个好主意,当运行脚本时,其他的客户端会认为服务器忙. 共有6个lua脚本相关的命令: 1. eval 可以对输入的脚本求值:    EVAL script numkeys key [key ...] arg [arg ...] numkeys 参数用于指定键名参数的个数,键名参数key[key...] 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis

Redis集成Lua脚本实现

作者:zhanhailiang 日期:2014-12-02 相关依赖 1. 环境部署 Redis安装配置教程及phpredis扩展安装测试 Redis安装以及php扩展 Windows下安装phpredis模块(当前Window环境下的php_redis.dll基本还是2.1.3,而Linux下的redis.so版本已经到了2.2.5,这可能导致部分指令集的支持程度不同) 2. Redis指令手册 php-redis中文帮助手册.chm(这份手册相对较旧,请参照Redis Commands) R