簡單的 Lua 預處理器

lua-users home
wiki

雖然簡單,但功能卻強大。稍微複雜一點的版本,多了幾個額外的功能,可以在 SlightlyLessSimpleLuaPreprocessor 找到。

function prep(file)
  local chunk = {n=0}
  for line in file:lines() do
     if string.find(line, "^#") then
      table.insert(chunk, string.sub(line, 2) .. "\n")
     else
      local last = 1
      for text, expr, index in string.gmatch(line, "(.-)$(%b())()") do 
        last = index
        if text ~= "" then
          table.insert(chunk, string.format('io.write %q ', text))
        end
        table.insert(chunk, string.format('io.write%s ', expr))
      end
      table.insert(chunk, string.format('io.write %q\n',
                                         string.sub(line, last).."\n"))
    end
  end
  return loadstring(table.concat(chunk))()
end

以 # 開頭的行會當作 Lua 執行。其他行會そのまま送出,但其中出現的 $(...) 會執行。(不會進行剖析,因此在使用 $(s 變數時必須注意)

範例輸入

#if DEBUG then
  function log(fmt, ...) print(string.format(fmt, unpack(arg))) end
#else
  function log() end
#end

#for i = 0, 10 do
  var$(i) = $(math.sin(math.pi * i / 10))
#end

範例輸出

> prep(assert(io.open"sample.luap"))
  function log() end

  var0 = 0
  var1 = 0.30901699437495
  var2 = 0.58778525229247
  var3 = 0.80901699437495
  var4 = 0.95105651629515
  var5 = 1
  var6 = 0.95105651629515
  var7 = 0.80901699437495
  var8 = 0.58778525229247
  var9 = 0.30901699437495
  var10 = 1.2246467991474e-16



> DEBUG = true
> prep(assert(io.open"sample.luap"))
  function log(fmt, ...) print(string.format(fmt, unpack(arg))) end

  var0 = 0
  var1 = 0.30901699437495
  var2 = 0.58778525229247
  var3 = 0.80901699437495
  var4 = 0.95105651629515
  var5 = 1
  var6 = 0.95105651629515
  var7 = 0.80901699437495
  var8 = 0.58778525229247
  var9 = 0.30901699437495
  var10 = 1.2246467991474e-16


RecentChanges · 偏好設定
編輯 · 歷史紀錄
最後編輯日期 2013 年 7 月 3 日格林威治標準時間下午 8:02 (差異)