gpt4 book ai didi

string - 向 Lua 添加裸词

转载 作者:行者123 更新时间:2023-12-01 01:06:05 24 4
gpt4 key购买 nike

要在 lua 中实现特定领域的语言,
我想在语言中添加裸词。
以便print("foo")可以写成 print(foo)
我这样做的方法是更改​​环境表的元表 _G .

mt = {__index = function(tbl,key) return key end}
setmetatable(_G, mt)

这很有效,因为检索变量 foo 的值由 _G.foo 完成相当于 _G["foo"]
这是一个好方法吗?
是否有隐藏的缺点?
有没有更好的办法?
我可以这样做,以便裸词只能在某个文件中工作吗?
(也许通过使用 loadstring 从另一个 luascript 执行该文件)

最佳答案

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

print(foo)   -- does what you think
local foo = 2
print(foo) -- argh!

请注意,您不能阻止在脚本中定义局部变量。

编辑: (回答评论)。

您使用的是定制的 Lua 引擎吗?您无法阻止进入本地范围,因为您始终处于本地范围内。恰恰相反:从技术上讲,没有全局 范围在 Lua 中(例如与 C 中的含义相同)。有一个全局 命名空间 (作为表格实现),而不是。 Lua 5.1(函数环境)和 Lua 5.2(隐式 _ENV 前缀)访问全局变量的机制不同,但概念几乎相同。

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

关于string - 向 Lua 添加裸词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18652859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com