Changeset 4723


Ignore:
Timestamp:
11/14/03 00:00:47 (18 years ago)
Author:
piso
Message:

MAPCAR: minor optimization.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/Primitives.java

    r4674 r4723  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.493 2003-11-07 20:20:14 piso Exp $
     5 * $Id: Primitives.java,v 1.494 2003-11-14 00:00:47 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    22432243
    22442244    // ### mapcar
    2245     private static final Primitive MAPCAR = new Primitive("mapcar") {
    2246         public LispObject execute(LispObject first, LispObject second)
    2247             throws ConditionThrowable
    2248         {
    2249             // First argument must be a function.
    2250             LispObject fun = first;
    2251             if (fun instanceof Symbol)
    2252                 fun = fun.getSymbolFunction();
    2253             if (!(fun instanceof Function || fun instanceof GenericFunction))
    2254                 throw new ConditionThrowable(new UndefinedFunction(first));
    2255             // Second argument must be a list.
    2256             LispObject list = checkList(second);
    2257             final LispThread thread = LispThread.currentThread();
    2258             LispObject result = NIL;
    2259             LispObject splice = null;
    2260             while (list != NIL) {
    2261                 LispObject obj = funcall1(fun, list.car(), thread);
    2262                 if (splice == null) {
    2263                     result = new Cons(obj, result);
    2264                     splice = result;
    2265                 } else {
    2266                     Cons cons = new Cons(obj);
    2267                     splice.setCdr(cons);
    2268                     splice = cons;
    2269                 }
    2270                 list = list.cdr();
    2271             }
    2272             return result;
     2245    private static final Primitive MAPCAR = new Primitive("mapcar")
     2246    {
     2247        public LispObject execute(LispObject op, LispObject list)
     2248            throws ConditionThrowable
     2249        {
     2250            LispObject fun;
     2251            if (op instanceof Symbol)
     2252                fun = op.getSymbolFunction();
     2253            else
     2254                fun = op;
     2255            if (fun instanceof Function || fun instanceof GenericFunction) {
     2256                final LispThread thread = LispThread.currentThread();
     2257                LispObject result = NIL;
     2258                LispObject splice = null;
     2259                while (list != NIL) {
     2260                    LispObject obj = funcall1(fun, list.car(), thread);
     2261                    if (splice == null) {
     2262                        result = new Cons(obj, result);
     2263                        splice = result;
     2264                    } else {
     2265                        Cons cons = new Cons(obj);
     2266                        splice.setCdr(cons);
     2267                        splice = cons;
     2268                    }
     2269                    list = list.cdr();
     2270                }
     2271                return result;
     2272            }
     2273            throw new ConditionThrowable(new UndefinedFunction(op));
    22732274        }
    22742275        public LispObject execute(LispObject first, LispObject second,
Note: See TracChangeset for help on using the changeset viewer.