String 向Lua添加单词

String 向Lua添加单词,string,lua,metatable,String,Lua,Metatable,要在lua中实现特定于领域的语言, 我想给这门语言添加一些简单的词。 以便 print(“foo”)可以写成print(foo) 我这样做的方法是更改环境表的元表\u G mt = {__index = function(tbl,key) return key end} setmetatable(_G, mt) 这是可行的,因为检索变量foo的值是由\u G.foo完成的,这相当于\u G[“foo”] 这是一个好方法吗? 有隐藏的缺点吗? 有更好的办法吗? 我可以这样做,使裸字只在某个文件中

要在lua中实现特定于领域的语言, 我想给这门语言添加一些简单的词。 以便
print(“foo”)
可以写成
print(foo)

我这样做的方法是更改环境表的元表
\u G

mt = {__index = function(tbl,key) return key end}
setmetatable(_G, mt)
这是可行的,因为检索变量
foo
的值是由
\u G.foo
完成的,这相当于
\u G[“foo”]

这是一个好方法吗? 有隐藏的缺点吗? 有更好的办法吗? 我可以这样做,使裸字只在某个文件中工作吗?
(可能通过从另一个luascript执行该文件,使用
loadstring

一旦有人使用与您的“关键字”相同的名称声明一个本地文件,它将隐藏您的“关键字/全局变量”,您的机制将失败:

print(foo)   -- does what you think
local foo = 2
print(foo)   -- argh!
请注意,不能阻止在脚本中定义局部变量

编辑:(回答评论)

您是否使用定制的Lua引擎?您不能阻止进入本地范围,因为您总是在本地范围内。事实恰恰相反:从技术上讲,Lua中没有全局范围(例如,与C中的含义相同)。而是有一个全局名称空间(作为表实现)。Lua5.1(函数环境)和Lua5.2(隐式
\u ENV
前缀)访问全局变量的机制不同,但概念几乎相同


特别是,当Lua脚本被加载时,无论是由解释器加载,还是由
load
loadstring
dofile
等加载,它都被解释为匿名函数体(闭包),通常称为“主块”。因此,始终存在局部范围。在标准Lua中,当解析器在加载的脚本中遇到
local
语句时,您无法阻止局部变量的定义。

实际上,我可以阻止所有变量的定义。(我不知道为什么这对局部变量有效,我想这会阻止你进入局部范围)。在metamethod:
\uuuu newindex=function(tbl,key,value)end
\u G
我使用lua 5.2进行的测试是,这阻止了许多变量声明添加其键。(我觉得很脏)我正在使用标准debian存储库中的Lua5.2.1。我知道,(但不知道为什么,正如我所说),但如果我添加元方法:
\uuuuunewindex=function(tbl,key,value)end
\G
。输入:
print(foo)local foo=2 print(foo)
输出:“foo-foo”。它不应该这样做(对我来说也不应该这样——WindowsXP,Lua5.1.5和5.2.2)。可能是5.2.1中的一个bug(但我对此非常怀疑),或者是一些非标准的补丁程序。尝试更新到5.2.2(或在另一个系统上尝试),看看是否得到相同的行为。顺便问一下,你真的确定你的Lua版本没有以某种方式修补吗?发布一个完整的示例,展示您正在试验的行为()。