Changeset 11008


Ignore:
Timestamp:
03/15/06 02:23:49 (15 years ago)
Author:
piso
Message:

Cleanup. All ansi-tests now pass (do.lsp, dostar.lsp).

File:
1 edited

Legend:

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

    r10966 r11008  
    33 *
    44 * Copyright (C) 2003-2006 Peter Graves
    5  * $Id: Do.java,v 1.14 2006-01-20 13:43:19 piso Exp $
     5 * $Id: Do.java,v 1.15 2006-03-15 02:23:49 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    5252    LispObject varList = args.car();
    5353    LispObject second = args.cadr();
    54     LispObject endTestForm = second.car();
     54    LispObject end_test_form = second.car();
    5555    LispObject resultForms = second.cdr();
    5656    LispObject body = args.cddr();
    5757    // Process variable specifications.
    58     int length = varList.length();
     58    final int length = varList.length();
    5959    Symbol[] variables = new Symbol[length];
    60     LispObject[] initials = new LispObject[length];
    61     LispObject[] updates = new LispObject[length];
     60    LispObject[] init_forms = new LispObject[length];
     61    LispObject[] step_forms = new LispObject[length];
    6262    for (int i = 0; i < length; i++)
    6363      {
     
    6666          {
    6767            variables[i] = checkSymbol(obj.car());
    68             initials[i] = obj.cadr();
     68            init_forms[i] = obj.cadr();
    6969            // Is there a step form?
    70             if (obj.cdr().cdr() != NIL)
    71               updates[i] = obj.cdr().cdr().car();
     70            if (obj.cddr() != NIL)
     71              step_forms[i] = obj.caddr();
    7272          }
    7373        else
     
    7575            // Not a cons, must be a symbol.
    7676            variables[i] = checkSymbol(obj);
    77             initials[i] = NIL;
     77            init_forms[i] = NIL;
    7878          }
    7979        varList = varList.cdr();
     
    113113        Symbol symbol = variables[i];
    114114        LispObject value =
    115           eval(initials[i], (sequential ? ext : env), thread);
     115          eval(init_forms[i], (sequential ? ext : env), thread);
    116116        if (specials != NIL && memq(symbol, specials))
    117           {
    118117            thread.bindSpecial(symbol, value);
    119             ext.declareSpecial(symbol);
    120           }
    121118        else if (symbol.isSpecialVariable())
    122           {
    123             thread.bindSpecial(symbol, value);
    124           }
     119          thread.bindSpecial(symbol, value);
    125120        else
    126121          ext.bind(symbol, value);
     122      }
     123    LispObject list = specials;
     124    while (list != NIL)
     125      {
     126        ext.declareSpecial(checkSymbol(list.car()));
     127        list = list.cdr();
    127128      }
    128129    final LispObject stack = thread.getStack();
     
    146147            // Execute body.
    147148            // Test for termination.
    148             if (eval(endTestForm, ext, thread) != NIL)
     149            if (eval(end_test_form, ext, thread) != NIL)
    149150              break;
    150151            remaining = body;
     
    190191                for (int i = 0; i < length; i++)
    191192                  {
    192                     LispObject update = updates[i];
    193                     if (update != null)
     193                    LispObject step = step_forms[i];
     194                    if (step != null)
    194195                      {
    195196                        Symbol symbol = variables[i];
    196                         LispObject value = eval(update, ext, thread);
    197                         if (symbol.isSpecialVariable() ||
    198                             (specials != NIL && memq(symbol, specials)))
     197                        LispObject value = eval(step, ext, thread);
     198                        if (symbol.isSpecialVariable()
     199                            || ext.isDeclaredSpecial(symbol))
    199200                          thread.rebindSpecial(symbol, value);
    200201                        else
     
    209210                for (int i = 0; i < length; i++)
    210211                  {
    211                     LispObject update = updates[i];
    212                     if (update != null)
    213                       {
    214                         LispObject result = eval(update, ext, thread);
     212                    LispObject step = step_forms[i];
     213                    if (step != null)
     214                      {
     215                        LispObject result = eval(step, ext, thread);
    215216                        results[i] = result;
    216217                      }
     
    223224                        Symbol symbol = variables[i];
    224225                        LispObject value = results[i];
    225                         if (symbol.isSpecialVariable() ||
    226                             (specials != NIL && memq(symbol, specials)))
     226                        if (symbol.isSpecialVariable()
     227                            || ext.isDeclaredSpecial(symbol))
    227228                          thread.rebindSpecial(symbol, value);
    228229                        else
Note: See TracChangeset for help on using the changeset viewer.