2

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

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

一个类似 Cpp 的预处理器将在这里帮助用命名常量替换数字。

有没有好的方法来实现这一目标?LUA 本身的预处理器,加载脚本并编辑块然后加载它将是一个变体,但我认为这首先会耗尽资源......

4

1 回答 1

0

所以,我找到了一个简单的解决方案:在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-03T10:05:14.280 回答