我想在iPhone上使用Lua.在Mac OS X上,在普通(非iOS)Cocoa应用程序中,我使用了以下代码:
lua_State* l;
l = lua_open();
luaL_openlibs(l);
luaL_loadstring(l, "print(\"Hi from Lua\");");
lua_pcall(l, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
我从lua.org/ftp下载了Lua 5.1.4并将其编译为Mac OS X.在Xcode项目中,我使用"添加现有框架"进行添加,liblua.a并使用"添加现有文件"添加include目录.
这按预期工作,并打印字符串:"来自Lua".当我在iOS项目中尝试相同的事情时,它会给出错误:
"_luaL_newstate", referenced from:
_main in main.o
more of the same thing...
symbol(s) not found
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
似乎.a文件没有链接到iPhone应用程序.有人知道如何使这项工作?
(顺便说一句,我真的不在乎苹果可能不接受我的应用程序,如果它有Lua.)
是否有Lua衍生或启发的虚拟机和语言概要?通过派生,我的意思是除了嵌入和扩展模块之外的用法.我想研究Lua技术树,并且正在寻找我们已经存在的知识的综合知识.
当前清单:
lua language-features programming-languages language-design virtual-machine
对于我目前正在进行的项目,我希望将脚本引擎嵌入到我的C++代码中,以便在线下实现一些可扩展性.该应用程序将需要相当数量的文本处理和在这些脚本中使用正则表达式.
我知道Lua在嵌入式脚本方面通常是业界的宠儿,但我也知道它不支持正则表达式(至少开箱即用).这让我倾向于使用python来嵌入我的语言,因为它似乎拥有Lua背后的最佳支持,并且仍然提供强大的正则表达式功能.
这是正确的选择吗?我应该看另一种语言吗?我有理由再给Lua看一眼吗?
如何配置awesome所以它将启动新的应用程序与两个窗口对齐如下:
----------------
|xxxxxxxxxx####|
|xxxxxxxxxx####|
|xxxxxxxxxx####|
|xxxxxxxxxx####|
----------------
Run Code Online (Sandbox Code Playgroud)
其中"x"是例如pidgin中的对话窗口,而'#'是好友列表窗口.
一般来说,我想指定右窗口的宽度并将其放在右侧(垂直最大化),另一个窗口应占用剩余空间.
我已经有了一些几乎工作的代码,但它的行为很奇怪(它设置了一切正确的pidgin,但它不适用于gimp和v_sim,偶尔也没有任何我知道的原因它会改变左窗口的几何形状.或者当我启动应用程序(v_sim)它没有放在正确的位置,并没有垂直最大化,但当我重新启动awesome时,它正确放置.所以我猜这个应用程序在启动时会改变一些东西.
这是我现在使用的代码:
awful.rules.rules = {
...
{ rule = { class = "Pidgin", role = "buddy_list" },
properties = {
floating = true
},
callback = function( c )
local w_area = screen[ c.screen ].workarea
local winwidth = 340
c:struts( { right = winwidth } )
c:geometry( { x = w_area.width - winwidth, width = winwidth, y = w_area.y, height = w_area.height } )
end
},
{ rule = { class …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Ruby中基于文本的游戏引擎,应用程序分为/ lib中的Ruby代码和/ data中的YAML数据,在游戏需要时加载.我想允许数据文件包含基本脚本,主要是在事件/观察者模型中.但是,我还希望用户能够生成和共享自定义方案,而无需担心脚本中嵌入的恶意代码.
附录:我最初的计划是将用户创建的内容分为两种类型,"模块"只是数据(因此是安全的)和插件,它们增加了额外的功能(但显然不安全).为了类似于桌面游戏,模块就像发布的冒险场景和内容,插件将是包含附加规则和系统的规则手册.
示例脚本(当然语法可根据解决方案进行更改):
---
Location:
observers:
on_door_open: |
monster = spawn_monster(:goblin);
monster.add_item(random_item());
monster.hostile = true;
Run Code Online (Sandbox Code Playgroud)
从安全角度来看,如果脚本严格选择加入,可能是通过包含一个带有一点DSL的mixin来实现,例如:
class Frog
include Scriptable
def jump; ... ; end # this can be called from a script
allow_scripting :jump
def ribbit; ... ; end # this cannot be called from a script
end
Run Code Online (Sandbox Code Playgroud)
我看了三个四个选项,但我不确定哪种方法最好:
使用Ruby脚本,但在某种沙箱中.
优点:非常熟悉Ruby,不需要"粘合"代码或在语言之间集成对象的问题.
缺点:不太熟悉安全问题或沙盒,没有找到任何看似合适的开箱即用的解决方案.
实现嵌入另一种脚本语言,例如Lua.
优点: Ruby和Lua是基于C语言的,因此绑定应该相当简单.Lua是一种相当流行的语言,如果我以后遇到问题,请提供帮助.安全,因为我没有特别绑定的任何功能都将无法从脚本中获取.
缺点:现有的Ruby-Lua绑定似乎是单向的,旧的,维护不良,或两者兼而有之.似乎是一种狡猾的狡猾,将脚本语言嵌入到另一种脚本语言中.
使用Ruby解释器实现自定义脚本语言.我一直在试验 Treetop,制作一个足以满足脚本的简单语法应该不会太难.
优点:无需嵌入其他语言.只有我专门实现的功能才可用于脚本.
缺点:矫枉过正."没有建在这里"的综合症.可能是可怕的虫巢等待发生.
使用特定于域的语言完全在Ruby中实现数据文件.
优点:简单易行.
缺点:用户创建的数据不可信任.
我也对我可能没有想过的那份没有列出的建议持开放态度.安全实现嵌入数据文件的脚本的最佳解决方案是什么?
编辑2011年12月23日: …
我已经读过,与for循环相比,ipairs的使用速度很慢,我是否应该改变编程习惯?我将在一天使用lua 5.2,目前为5.1.
我的阵列最多约有1000个项目.
local mytbl = { 'a','b','c','e'}
for i,v in ipairs(mytbl) do
print(i,v)
end
for i=1,#mytbl do
print(i,mytbl[i])
end
Run Code Online (Sandbox Code Playgroud) 有点困惑这一切; 所以这就是我想要做的!因此有一个def:
block_basic_DEF =
{
image = "button.png",
name = "basic block",
obj_table = this_obj_table.common_objects_table,
startup = function() init(), <----- This is the problem
}
Run Code Online (Sandbox Code Playgroud)
在另一个文件中,我可以通过以下方式访问:
function spawn(params)
local obj = display.newImage(params.image)
-- etc.
Run Code Online (Sandbox Code Playgroud)
在那里block_basic_DEF我希望传递init()函数的地址,以便在我的spawn中我可以做类似的事情:
params.startup() --ie实际上调用了原始的init函数
就像在python中我可以使用切片.喜欢以下
b=[1,2,3,4,5]
a=b[0:3]
Run Code Online (Sandbox Code Playgroud)
我可以在没有循环的情况下在Lua中进行这种操作.Or Loop是最有效的方法
在for循环中,使用pairs()和ipairs()循环有什么区别?此页面同时使用:Lua文档
使用ipairs():
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
Run Code Online (Sandbox Code Playgroud)
结果:
1 one
2 two
3 three
Run Code Online (Sandbox Code Playgroud)
使用pairs():
a = {"one", "two", "three"}
for i, v in pairs(a) do
print(i, v)
end
Run Code Online (Sandbox Code Playgroud)
结果:
1 one
2 two
3 three
Run Code Online (Sandbox Code Playgroud)
您可以在这里进行测试:Lua演示
lua ×10
scripting ×2
awesome-wm ×1
c++ ×1
cocoa-touch ×1
for-loop ×1
function ×1
game-engine ×1
iphone ×1
macos ×1
python ×1
ruby ×1
syntax ×1