LUA 使用命名常量访问索引表

在一个资源有限的 µC 项目中,我使用 LUA 作为嵌入式语言。为了节省一些循环和内存,我总是只使用基于索引的表访问 (table[1]) 而不是基于哈希的访问 (table.someMeaning = 1)。这样可以节省大量的内存。

这种方法的明显缺点是整个代码中的魔术数字。

类似于 Cpp 的预处理器会帮助读者替换数字为命名常量。

有什么好的方式实现这个功能吗? LUA 本身的预处理器,加载脚本并编辑块,然后再加载脚本,也是一种方法,但我觉得这首先会消耗资源 ...

原文链接 https://stackoverflow.com/questions/69821398

点赞
stackoverflow用户10953006
stackoverflow用户10953006

所以,我找到了一个简单的解决方案:用 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()
}
2021-11-03 10:05:14