major rewrite:   finally understand S-LETALL, implemented.   stop 'rendering' type schemes into human form just     so they'll get chopped back up into tiny pieces again     when instantiated. gen_cexp():   handle non-arrow cexp types (e.g., for C constants) gen_vcase():   have to handle this node type in order to re-type after analysis/inlining unifier():   a dict to hold memoized decode results   reworked the way we store equations and variables:  using mutation on the '.eq'     slot was causing a *lot* of confusion, so now we have a map from var->eq. is_free():   no longer needed split():   reworked decode():   switch from '.eq' slot to var->eq map sanity():   check invariants in new data structure simplify():   done much more carefully! prune():   new function to slim a constraint by removing unnecessary equations   [why this should be necessary is still a mystery to me] find_free():   find the free variables of a unifier/subst reverse_graph():   to help traverse the equation graph bottom up, used by do_letall() do_letall():   implement the S-LETALL rule solver():   separate the notion of 'verbose' from 'single-stepping' solve():   temporarily disabled the catching of type errors   s-solve-id:     let self.lookup() instantiate the constraint   s-letall:     finally implemented this rule.     call move_exists() to move any 'older' vars up and out   s-pop-let:     actually lower the rank (ugh, how embarrassing) build_type_schemes():   removed instantiate_scheme():   instantiate the schemes returned by lookup_special_names() instantiate_constraint():   instantiate a constraint-based scheme lookup_special_names():   added %rset   sum->rsum, product->rproduct print_solution():   removed get_record_sig():   redone, probably be able to remove or simplify this typer.decode():   much simpler decoding using the node.tv variable.
major rewrite:
  finally understand S-LETALL, implemented.
  stop 'rendering' type schemes into human form just
    so they'll get chopped back up into tiny pieces again
    when instantiated.
gen_cexp():
  handle non-arrow cexp types (e.g., for C constants)
gen_vcase():
  have to handle this node type in order to re-type after analysis/inlining
unifier():
  a dict to hold memoized decode results
  reworked the way we store equations and variables:  using mutation on the '.eq'
    slot was causing a *lot* of confusion, so now we have a map from var->eq.
is_free():
  no longer needed
split():
  reworked
decode():
  switch from '.eq' slot to var->eq map
sanity():
  check invariants in new data structure
simplify():
  done much more carefully!
prune():
  new function to slim a constraint by removing unnecessary equations
  [why this should be necessary is still a mystery to me]
find_free():
  find the free variables of a unifier/subst
reverse_graph():
  to help traverse the equation graph bottom up, used by do_letall()
do_letall():
  implement the S-LETALL rule
solver():
  separate the notion of 'verbose' from 'single-stepping'
solve():
  temporarily disabled the catching of type errors
  s-solve-id:
    let self.lookup() instantiate the constraint
  s-letall:
    finally implemented this rule.
    call move_exists() to move any 'older' vars up and out
  s-pop-let:
    actually lower the rank (ugh, how embarrassing)
build_type_schemes():
  removed
instantiate_scheme():
  instantiate the schemes returned by lookup_special_names()
instantiate_constraint():
  instantiate a constraint-based scheme
lookup_special_names():
  added %rset
  sum->rsum, product->rproduct
print_solution():
  removed
get_record_sig():
  redone, probably be able to remove or simplify this
typer.decode():
  much simpler decoding using the node.tv variable.


samrushing/irken-compiler,samrushing/irken-compiler,samrushing/irken-compiler,samrushing/irken-compiler