//last arg must be seq
        internal Object apply(params Object[] args)
        {
            Object      f     = Primitives.arg(0, args);
            IEnumerator tail  = (IEnumerator)get_enum_gf.Invoke(args[args.Length - 1]);
            ArrayList   fargs = new ArrayList();

            for (int i = 1; i < args.Length - 1; i++)
            {
                fargs.Add(args[i]);
            }
            while (tail.MoveNext())
            {
                fargs.Add(tail.Current);
            }
            return(Util.InvokeObject(f, fargs.ToArray()));
        }
        internal Object map_to_list(params Object[] args)
        {
            Object f = Primitives.arg(0, args);

            IEnumerator[] enums = new IEnumerator[args.Length - 1];
            for (int i = 0; i < enums.Length; i++)
            {
                enums[i] = (IEnumerator)get_enum_gf.Invoke(Primitives.arg(i + 1, args));
            }
            //n.b. setting up arg array which will be reused
            //mean functions cannot assume ownership of args w/o copying them
            Object[] fargs = new Object[enums.Length];
            Cons     ret   = null;
            Cons     tail  = null;

            while (true)
            {
                for (int i = 0; i < enums.Length; i++)
                {
                    if (enums[i].MoveNext())
                    {
                        fargs[i] = enums[i].Current;
                    }
                    else             //bail on shortest
                    {
                        return(ret);
                    }
                }

                Object x    = Util.InvokeObject(f, fargs);
                Cons   node = new Cons(x, null);
                if (ret == null)
                {
                    ret = tail = node;
                }
                else
                {
                    tail = tail.rest = node;
                }
            }
        }
        internal Object internf(params Object[] args)
        {
            String sym = (String)Primitives.arg(0, args);

            return(symbolTable.intern(sym));
        }
        internal Object loadf(params Object[] args)
        {
            String path = (String)Primitives.arg(0, args);

            return(LoadFile(path));
        }
        internal Object evalf(params Object[] args)
        {
            Object x = Primitives.arg(0, args);

            return(eval(x, globalenv));
        }