       object *envcopy = NULL;
       while (env != NULL) {
         object *pair = first(env);
-        if (pair != NULL) {
-          object *val = cdr(pair);
-          if (integerp(val)) val = number(val->integer);
-          push(cons(car(pair), val), envcopy);
-        }
+        if (pair != NULL) push(pair, envcopy);
         env = cdr(env);
       }
       return cons(symbol(CLOSURE), cons(envcopy,args));

  return tf_progn(function, *env);
}

object *apply (object *function, object *args, object **env) {
  if (symbolp(function)) {
    symbol_t name = function->name;
    int nargs = listlength(args);
    if (name >= ENDFUNCTIONS) error2(function, PSTR("is not valid here"));
    if (nargs<lookupmin(name)) error2(function, PSTR("has too few arguments"));
    if (nargs>lookupmax(name)) error2(function, PSTR("has too many arguments"));
    return ((fn_ptr_type)lookupfn(name))(args, *env);
  }
  if (listp(function) && issymbol(car(function), LAMBDA)) {
    function = cdr(function);
    object *result = closure(0, NULL, NULL, function, args, env);
    return eval(result, *env);
  }
  if (listp(function) && issymbol(car(function), CLOSURE)) {
    function = cdr(function);
    object *result = closure(0, NULL, car(function), cdr(function), args, env);
    return eval(result, *env);
  }
  error2(function, PSTR("is an illegal function"));
  return NULL;

char *MakeFilename (object *arg) {
  char *buffer = SymbolTop;
  int max = maxbuffer(buffer);
  int i = 0;
  do {
    char c = nthchar(arg, i);
    if (c == '\0') break;
