
require:
   "./expand" as mt ->
      Env, Expander, topscope


provide:
   stdenv
   make_expander


stdenv = Env{}

mac{name}{m} =
   m2{ctx, info, form, match expr} =
      {brackets => "()"} ->
         throw E.syntax.no_parens with
            "Parentheses cannot be used here.
             Use [] or {} depending on your intent.
             []s are usually equivalent to an absence
             of brackets.
             ".replace{R.g"\n *", " "}
            {expr = expr}
      else ->
         m.call{this, ctx, info, form, expr}
   stdenv.bind{topscope, name, #macro{m2}}
   m2

bind{name, value} =
   stdenv.bind{topscope, name, value}

;; "consts core operators loop quote regexp modularity
;;  testing misc macrodef async logic".split{R"[\n ]+"} each
;;    m -> require{^["./macros/" + m]}{mac, bind}

require{"./macros/consts"}{mac, bind}
require{"./macros/core"}{mac, bind}
require{"./macros/operators"}{mac, bind}
require{"./macros/loop"}{mac, bind}
require{"./macros/quote"}{mac, bind}
require{"./macros/regexp"}{mac, bind}
require{"./macros/modularity"}{mac, bind}
require{"./macros/misc"}{mac, bind}
require{"./macros/macrodef"}{mac, bind}
require{"./macros/async"}{mac, bind}
require{"./macros/logic"}{mac, bind}


make_expander{pipeline} =
   Expander{stdenv.fork{}, generic_nodes, pipeline} where
      generic_nodes = {
         .if
         .js_while, .js_for, .js_for_in, .js_for_of, .js_label
         .js_break, .js_continue, .js_return
         .js_delete, .js_throw, .js_try, .js_new
         .js_yield
         .js_class, .js_super
      }
