标签: luajit

我的用于Lua的DSL会工作吗?(这似乎太简单了)

我真的很喜欢Lua作为一种编程语言,但令人难以置信的是,我必须经常local为所有局部变量键入" ".

它只是让我的代码看起来更混乱.

所以我想知道,我可以在Lua之上创建一个域特定语言(DSL)来简单地使用以下变量命名约定.

  1. 如果变量名称在所有大写字母中,那么它是一个全局变量
  2. 否则,变量是local变量

问题:这是否有效 - 是或否?

换一种说法:

-- In Lua 5.2
isGlobalinLua  = "is global in default Lua"
GLOBALVAR      = "is global var in default Lua"
local localvar = "is local var in default Lua"

-- In my DSL Lua language
isLocalinDSLLua = "is local in DSL Lua"  -- translates to: local isLocalinDSLLua = ...
GLOBALVAR       = "is global DSL Lua"
localvar        = "is local var in DSL Lua"  -- …
Run Code Online (Sandbox Code Playgroud)

dsl lua preprocessor luajit

5
推荐指数
2
解决办法
716
查看次数

使用Luajit时,使用FFI或普通的lua绑定是否更好?

我刚开始使用C++修改Luajit,我发现它的FFI非常易于使用,但我不确定它是否是所有(或至少大多数)案例的最佳解决方案.

那么使用其中一个更好,还是仅仅是偏好?

c++ scripting lua ffi luajit

5
推荐指数
1
解决办法
4677
查看次数

Lua表内存?

这可能是一个奇怪的问题,但是当我填满一个包含1400万件物品的桌子后,当我最终收到内存错误时,好奇心得到了最好.

是否存在Lua表的一种设置内存限制,还是有点动态?我认为Lua本身一般会分配如此多的内存,并且当它耗尽时会抛出错误,但这只是一个疯狂的猜测.有人知道吗?谢谢.

memory lua allocation luajit lua-table

5
推荐指数
1
解决办法
3730
查看次数

使用LuaJIT编写脚本并有选择地沙盒化FFI

在尝试并见证了我可以将Lua和LuaJIT集成到我的游戏引擎中的难以置信的轻松之后,我确信这是我想要使用的脚本语言.我想将它用于我的AI,单位描述,地图触发器等等.(尽可能真的).这个问题不仅适用于gamedev,我可以想象创建一个可编写脚本的编辑器或窗口管理器,它可以加载外部脚本(例如:使用python和包控制的sublime文本)

但现在我有一个难题:我非常感谢LuaJIT FFI提供的易用性,以便绑定到我的引擎,但我不想提供FFI的免费统治来映射作者.通过FFI进行lua-to-c调用的令人难以置信的速度(当JITted时)也是我真正想要的.

理想情况下,我会编写自己的包装器Lua文件,用FFI绑定到我的引擎,并导出一个很好的模块供地图作者和模拟器使用.我的替代方案是编写一个vanilla lua模块,这可能但更麻烦和更慢.

我在编译luajit时无法禁用FFI,因为显然我想自己使用它,但我没有看到如何在每个脚本或每个模块的基础上限制FFI.显然,FFI需要在我加载模块的lua_State中处于活动状态(之后我无法开始加载用户修改的脚本).那我该怎么办?它甚至可能吗?

编辑:在我看来,理想的工作流程是:

  1. 打开卢安州
  2. 加载所有模块(luaL_openlibs()),FFI也被预加载
  3. 加载我的.lua模块,使用FFI(这是引擎绑定,它们是可信文件,因此可以使用FFI)
  4. 禁用选择本机模块和函数:os,ffi,...(这是缺少的步骤)
  5. 执行用户提供的脚本(这些是不可信的,我不希望他们访问FFI)
  6. 可选:寻找一种方法来重新加载lua模块以实现快速编辑循环,这将涉及重新启用FFI和其他模块.(不知道怎么做)

注意:我知道这仍然不是一个完美的(甚至是好的沙盒),正如Mike Pall已经在他的一些邮件中指出的那样,但我仍然不想让地图作者访问FFI.

security lua sandbox ffi luajit

5
推荐指数
1
解决办法
2097
查看次数

从C运行luajit对象文件

来自文档:http://luajit.org/running.html

luajit -b test.lua test.obj                 # Generate object file
# Link test.obj with your application and load it with require("test")
Run Code Online (Sandbox Code Playgroud)

但是没有解释如何做这些事情.我猜他们假设任何使用Lua的人也是C程序员,而不是我的情况!我可以得到一些帮助吗?以GCC为例.

除了C字节数组头之外,我还想做同样的事情.我也找不到相关文档.

luajit -bt h -n test test.lua test.h
Run Code Online (Sandbox Code Playgroud)

这会创建头文件,但我不知道如何从C运行它.谢谢.

c lua luajit

5
推荐指数
2
解决办法
4824
查看次数

如何在命令行中列出模块和检查功能?

像许多"(windows)用户"一样,我不想花时间学习从源代码编译任何东西.所以Lua似乎是一个业余爱好者的非常好的选择.

对不起,如果这是一个非常简单的问题 - 但......

Q1.如何列出任何给定解释器实例可用的模块?

一些二进制发行版有许多编译为DLL的模块,有些已将它们添加到主EXE中.很高兴知道哪些模块内置在EXE中,并检查cpath是否正在查找任何其他DLL模块.

Q2.有没有办法在Lua的命令行获得帮助?

由于我是Lua的新手,我想要一个简单的方法来获得任何给定功能的帮助.在一些解释语言中有一个帮助("fname")函数,Matlab就是一个很好的例子.

Q3.可以将GSL-Shell的此功能修改为帮助系统的基础吗?(即使它只是确认了某个给定函数的存在,它会有所帮助)

local ffi = require 'ffi'

local help_files = {'graphics', 'matrix', 'iter', 'integ', 'ode', 'nlfit', 'vegas', 'rng', 'fft'}

local cdata_table = {'matrix', 'complex matrix', 'complex'}

local function help_init( ... )
    local REG = debug.getregistry()
    REG['GSL.help_hook'] = {}
end

local function open_module(modname)
    local fullname = string.format('help/%s', modname)
    local m = require(fullname)
    return m
end

local function search_help(func)
    for k, modname in ipairs(help_files) do
        local mt = getmetatable(func)
        local module = open_module(modname)
        if module[func] …

lua module luajit

5
推荐指数
1
解决办法
3292
查看次数

我可以创建函数`extern"c"`

我有一些cpp文件,我想用FFI将它们与LuaJit结合起来.

但问题是,我必须extern "c"为几乎每个函数添加符号,以使FFI可以访问它们.

有没有更简单的方法来完成这项工作?

c c++ lua ffi luajit

5
推荐指数
1
解决办法
262
查看次数

Lua和LuaJIT处理代码的方式有何不同?

据我了解,标准的Lua解释器首先将输入代码编译为“字节码”(的输出luac),然后“解释”该字节码。

但是,这基本上不是JIT编译器的定义吗?LuaJIT然后做什么?它与标准的Lua解释器有何不同?怎么会更快呢?

lua interpreter jit luajit

5
推荐指数
1
解决办法
1859
查看次数

在lua写一次表?

我想在Lua中使用一次写入表(特别是LuaJIT 2.0.3),这样:

local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz'  -- asserts false
Run Code Online (Sandbox Code Playgroud)

理想情况下,这将像常规表(pairs()和ipairs()工作)一样运行.

__newindex基本上与我想要实现它的方法相反,我不知道任何使用pair()和ipairs()使代理表模式工作的技术.

lua luajit lua-table

5
推荐指数
1
解决办法
105
查看次数

Lua/Luajit:同时编制索引和命名方法?

Lua的PILLuajit FFI教程给了两种用法__index在元表.

一个用于索引像obj [123],例如,

__index = function (self, k) return self._data+(k-self._lower)

另一种用法是定义命名方法,如教程中所给出的,

__index = { area = function(a) return a.x*a.x + a.y*a.y end? },

然后我们可以进行函数调用obj:area().

我可以同时做两件事,例如直接索引和命名方法吗?

lua ffi luajit

5
推荐指数
1
解决办法
78
查看次数

标签 统计

lua ×10

luajit ×10

ffi ×4

c ×2

c++ ×2

lua-table ×2

allocation ×1

dsl ×1

interpreter ×1

jit ×1

memory ×1

module ×1

preprocessor ×1

sandbox ×1

scripting ×1

security ×1