我在 µC 项目中使用 LUA 作为嵌入式语言,因此资源有限。为了节省一些周期和内存,我总是只使用基于索引的表访问 (table[1]) 而不是基于哈希的访问 (table.someMeaning = 1)。这样可以节省大量内存。
这种方法的明显缺点是代码中的魔术数字。
一个类似 Cpp 的预处理器将在这里帮助用命名常量替换数字。
有没有好的方法来实现这一目标?LUA 本身的预处理器,加载脚本并编辑块然后加载它将是一个变体,但我认为这首先会耗尽资源......
我在 µC 项目中使用 LUA 作为嵌入式语言,因此资源有限。为了节省一些周期和内存,我总是只使用基于索引的表访问 (table[1]) 而不是基于哈希的访问 (table.someMeaning = 1)。这样可以节省大量内存。
这种方法的明显缺点是代码中的魔术数字。
一个类似 Cpp 的预处理器将在这里帮助用命名常量替换数字。
有没有好的方法来实现这一目标?LUA 本身的预处理器,加载脚本并编辑块然后加载它将是一个变体,但我认为这首先会耗尽资源......
所以,我找到了一个简单的解决方案:在Lua
! 这可能是最容易做到的事情。
首先,全局定义您的符号:
MySymbols = {
FIELD_1 = 1,
FIELD_2 = 2,
FIELD_3 = 3,
}
然后你编写你的preprocessing
函数,它基本上只是用MySymbols
它们的值替换字符串。
function Preprocess (FilenameIn, FilenameOut)
local FileIn = io.open(FilenameIn, "r")
local FileString = FileIn:read("*a")
for Name, Value in pairs(MySymbols) do
FileString = FileString:gsub(Name, Value)
end
FileIn:close()
local FileOut = io.open(FilenameOut, "w")
FileOut:write(FileString)
FileOut:close()
end
然后,如果您尝试使用此输入文件test.txt
:
TEST FIELD_1
TEST FIELD_2
TEST FIELD_3
并调用以下函数:
Preprocess("test.txt", "test-out.lua")
您将获得出色的输出文件:
TEST 1
TEST 2
TEST 3
我让您乐于将它与您的脚本/工具链集成。
如果你想避免手动分配数字,你可以添加一个很棒的闭包:
function MakeCounter ()
local Count = 0
return function ()
Count = Count + 1
return Count
end
end
NewField = MakeCounter()
MySymbols = {
FIELD_1 = NewField(),
FIELD_2 = NewField(),
FIELD_3 = NewField()
}