   variableCounter = 1
   compileTop preCompileTop source
 
+# list of definitions followed by an expression
+compiledBottom = (source) ->
+  variableCounter = 1
+  compileBottom preCompileBottom source
+
 # single exp
 compiledExp = (source) ->
   variableCounter = 1

  result

typifyMost = (ast) ->
  apply ast, typeComments, typeDatas, typeTypes, labelSimple, labelMatches, labelFns

typify = (ast) ->
  apply ast, typifyMost, labelComments, labelOperators

typifyTop = (ast) ->
  apply ast, typifyMost, labelTop, labelComments, labelOperators

typifyDefinitions = (ast) ->
  apply ast, typifyMost, labelDefinitions, labelComments, labelOperators

compileTop = (ast) ->
  ast.scope = topScopeDefines()
  {body, wheres} = fnImplementation inside ast
  compileFnImpl body, wheres

compileBottom = (ast) ->
  ast.scope = topScopeDefines()
  {body, wheres} = bottomImplementation inside ast
  compileFnImpl body, wheres

compileWheres = (ast) ->
