code: function(ast, env, exprs) {
      if (exprs) {
          // Return new Env with symbols in ast bound to
          // corresponding values in exprs
          env = Object.create(env)
          ast.some((a,i) => a == "&" ? env[ast[i+1]] = exprs.slice(i)
                                     : (env[a] = exprs[i], 0))
          return env
      }
      // Evaluate the form/ast
      return ast instanceof Array                      // list?
          ? ast.map((...a) => EVAL(a[0], env))         // list
          : (typeof ast == "string")                   // symbol?
              ? ast in env                             // symbol in env?
                  ? env[ast]                           // lookup symbol
                  : null[ast]                          // undefined symbol
              : ast                                    // ast unchanged
  }
docs: 2 args: eval_ast, 3 args: env_bind