Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/MapAST1.lua.html
--   http://anggtwu.net/LUA/MapAST1.lua
--          (find-angg "LUA/MapAST1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- A tool for simplifying ASTs.
-- Used by:
--   (find-angg "LUA/CME2.lua" "grammar-tests")
-- Inspired by:
--   (find-angg "LUA/ParseTree2.lua" "ParseTree")
--
-- (defun e () (interactive) (find-angg "LUA/MapAST1.lua"))

-- «.MapAST»		(to "MapAST")
-- «.MapAST-tests»	(to "MapAST-tests")

require "ELpeg1"     -- (find-angg "LUA/ELpeg1.lua")



--  __  __               _    ____ _____ 
-- |  \/  | __ _ _ __   / \  / ___|_   _|
-- | |\/| |/ _` | '_ \ / _ \ \___ \ | |  
-- | |  | | (_| | |_) / ___ \ ___) || |  
-- |_|  |_|\__,_| .__/_/   \_\____/ |_|  
--              |_|                      
-- «MapAST»  (to ".MapAST")

MapAST = Class {
  type    = "MapAST",
  __index = {
    trivs  = Set.new(),
    istriv = function (m,o) return m.trivs:has(o) end,
    mkast  = function (m,o0,...) return mkast(o0, ...) end,
    mkf    = function (m) return function (o) return m:f(o) end end,
    f = function (m, o)
        if type(o) ~= "table" then return o end
        if m:istriv(o[0]) then return m:f(o[1]) end
        if m.heads[o[0]] then return m.heads[o[0]](m, o) end
        return m:mkast(o[0], unpack(map(m:mkf(), o)))
      end,
  },
}

-- «MapAST-tests»  (to ".MapAST-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "MapAST1.lua"
ma = MapAST {
  trivs = Set.from(split("() fun var num")),
  -- trivs = trivs1,
  heads = { 
    ["ap"] = function(m, o) return m:mkast(m:f(o[1]), m:f(o[2])) end,
  },
}

  o = mkast("var", "y")
  o = mkast("ap", "f", 42)
  o = mkast("ap", "f", mkast("ap", "g", 99))
  o = mkast("ap", "f", mkast("ap", "g", mkast("num", 99)))
= o
= ma:f(o)

--]==]



-- Local Variables:
-- coding:  utf-8-unix
-- End: