我真的很喜欢Lua作为一种编程语言,但令人难以置信的是,我必须经常local为所有局部变量键入" ".
它只是让我的代码看起来更混乱.
所以我想知道,我可以在Lua之上创建一个域特定语言(DSL)来简单地使用以下变量命名约定.
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) 我刚开始使用C++修改Luajit,我发现它的FFI非常易于使用,但我不确定它是否是所有(或至少大多数)案例的最佳解决方案.
那么使用其中一个更好,还是仅仅是偏好?
这可能是一个奇怪的问题,但是当我填满一个包含1400万件物品的桌子后,当我最终收到内存错误时,好奇心得到了最好.
是否存在Lua表的一种设置内存限制,还是有点动态?我认为Lua本身一般会分配如此多的内存,并且当它耗尽时会抛出错误,但这只是一个疯狂的猜测.有人知道吗?谢谢.
在尝试并见证了我可以将Lua和LuaJIT集成到我的游戏引擎中的难以置信的轻松之后,我确信这是我想要使用的脚本语言.我想将它用于我的AI,单位描述,地图触发器等等.(尽可能真的).这个问题不仅适用于gamedev,我可以想象创建一个可编写脚本的编辑器或窗口管理器,它可以加载外部脚本(例如:使用python和包控制的sublime文本)
但现在我有一个难题:我非常感谢LuaJIT FFI提供的易用性,以便绑定到我的引擎,但我不想提供FFI的免费统治来映射作者.通过FFI进行lua-to-c调用的令人难以置信的速度(当JITted时)也是我真正想要的.
理想情况下,我会编写自己的包装器Lua文件,用FFI绑定到我的引擎,并导出一个很好的模块供地图作者和模拟器使用.我的替代方案是编写一个vanilla lua模块,这可能但更麻烦和更慢.
我在编译luajit时无法禁用FFI,因为显然我想自己使用它,但我没有看到如何在每个脚本或每个模块的基础上限制FFI.显然,FFI需要在我加载模块的lua_State中处于活动状态(之后我无法开始加载用户修改的脚本).那我该怎么办?它甚至可能吗?
编辑:在我看来,理想的工作流程是:
注意:我知道这仍然不是一个完美的(甚至是好的沙盒),正如Mike Pall已经在他的一些邮件中指出的那样,但我仍然不想让地图作者访问FFI.
来自文档: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运行它.谢谢.
像许多"(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] … 我有一些cpp文件,我想用FFI将它们与LuaJit结合起来.
但问题是,我必须extern "c"为几乎每个函数添加符号,以使FFI可以访问它们.
有没有更简单的方法来完成这项工作?
据我了解,标准的Lua解释器首先将输入代码编译为“字节码”(的输出luac),然后“解释”该字节码。
但是,这基本上不是JIT编译器的定义吗?LuaJIT然后做什么?它与标准的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的PIL和Luajit 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().
我可以同时做两件事,例如直接索引和命名方法吗?