Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- -*- coding: raw-text -*-
-- makefile.lua - tools for generating makefiles.
-- This is part of blogme3.
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2007apr16
-- <http://anggtwu.net/blogme3/makefile.lua>
-- <http://anggtwu.net/blogme3/makefile.lua.html>
-- License: GPL.

-- (find-angg "TH/Files.tcl")

--------[ expandguillemets ]--------
-- Example:
-- FOO = {"foo", "bar", "plic"}
-- BLETCH = {"bletch", "blotch"}
-- print(expandguillemets("deps: «FOO| _.html» «BLETCH| _.html»"))
--  --> "deps:  foo.html bar.html plic.html  bletch.html blotch.html"

expandunderlines = function (guillemetbody)
    return function (underlineexpansion)
        return (string.gsub(guillemetbody, "_", underlineexpansion))
      end
  end

expandguillemet = function (arrayname, body)
    if type(_G[arrayname]) ~= "table" then
      error("expandguillemet: not a global table: "..arrayname)
    end
    return table.concat(map(expandunderlines(body), _G[arrayname]))
  end

expandguillemets = function (str)
    return (string.gsub(str, "«([A-Za-z_0-9]+)%s*|([^«»]*)»", expandguillemet))
  end

--------[ handle lists of files ]--------

toset = function (array)
    local set = {}
    for _,v in ipairs(array) do set[v]=v end
    return set
  end
toarray = function (set)
    local array = {}
    for k,v in pairs(set) do tinsert(array, v) end
    table.sort(array)
    return array
  end
minus = function (set1, set2)
    for k,v in pairs(set2) do set1[k] = nil end
    return set1
  end
without = function (str1, str2)
    local set1 = toset(split(str1))
    local set2 = toset(split(str2))
    return toarray(minus(set1, set2))
  end

splitandsort = function (str)
    local items = split(str)
    table.sort(items)
    return items
  end