Changeset 8104 for trunk/j/src


Ignore:
Timestamp:
11/04/04 17:19:31 (19 years ago)
Author:
piso
Message:

eval() refactoring (work in progress)

File:
1 edited

Legend:

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

    r8101 r8104  
    33 *
    44 * Copyright (C) 2002-2004 Peter Graves
    5  * $Id: Lisp.java,v 1.293 2004-11-04 11:28:33 piso Exp $
     5 * $Id: Lisp.java,v 1.294 2004-11-04 17:19:31 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    335335                    }
    336336                    default: {
    337                         return funcall(fun,
    338                                        evalList(obj.cdr(), env, thread),
    339                                        thread);
     337                        return evalCall(fun, obj.cdr(), env, thread);
    340338                    }
    341339                }
    342340            } else {
    343                 LispObject args = obj.cdr();
    344                 if (!args.listp())
    345                     return signal(new TypeError(args, "list"));
    346341                if (first.car() == Symbol.LAMBDA) {
    347342                    LispObject rest = first.cdr();
    348343                    Closure closure = new Closure(rest.car(), rest.cdr(), env);
    349                     return closure.execute(evalList(args, env, thread));
     344                    return closure.execute(evalList(obj.cdr(), env, thread));
    350345                } else
    351346                    return signal(new ProgramError("Illegal function object: " +
     
    356351    }
    357352
    358     private static final LispObject[] evalList(LispObject exps,
     353    private static final LispObject eval1(LispObject obj,
     354                                          Environment env,
     355                                          LispThread thread)
     356        throws ConditionThrowable
     357    {
     358        LispObject result = eval(obj, env, thread);
     359        thread._values = null;
     360        return result;
     361    }
     362
     363    private static final LispObject evalCall(LispObject function,
     364                                             LispObject args,
     365                                             Environment env,
     366                                             LispThread thread)
     367        throws ConditionThrowable
     368    {
     369        if (args == NIL)
     370            return thread.execute(function);
     371        LispObject first = args.car();
     372        LispObject rest = args.cdr();
     373        if (rest == NIL) {
     374            first = eval1(first, env, thread);
     375            return thread.execute(function, first);
     376        }
     377        LispObject second = rest.car();
     378        rest = rest.cdr();
     379        if (rest == NIL) {
     380            first = eval1(first, env, thread);
     381            second = eval1(second, env, thread);
     382            return thread.execute(function, first, second);
     383        }
     384        LispObject third = rest.car();
     385        rest = rest.cdr();
     386        if (rest == NIL) {
     387            first = eval1(first, env, thread);
     388            second = eval1(second, env, thread);
     389            third = eval1(third, env, thread);
     390            return thread.execute(function, first, second, third);
     391        }
     392        LispObject fourth = rest.car();
     393        rest = rest.cdr();
     394        if (rest == NIL) {
     395            first = eval1(first, env, thread);
     396            second = eval1(second, env, thread);
     397            third = eval1(third, env, thread);
     398            fourth = eval1(fourth, env, thread);
     399            return thread.execute(function, first, second, third, fourth);
     400        }
     401        return funcall(function,
     402                       evalList(args, env, thread),
     403                       thread);
     404    }
     405
     406    private static final LispObject[] evalList(LispObject args,
    359407                                               Environment env,
    360408                                               LispThread thread)
    361409        throws ConditionThrowable
    362410    {
    363         final int length = exps.length();
     411        final int length = args.length();
    364412        LispObject[] results = new LispObject[length];
    365413        for (int i = 0; i < length; i++) {
    366             results[i] = eval(exps.car(), env, thread);
    367             exps = exps.cdr();
     414            results[i] = eval(args.car(), env, thread);
     415            args = args.cdr();
    368416        }
    369417        // Ignore multiple values!
Note: See TracChangeset for help on using the changeset viewer.