Changeset 11315


Ignore:
Timestamp:
09/13/08 15:18:14 (14 years ago)
Author:
ehuelsmann
Message:

Fix LABELS.47 (special variables related).

File:
1 edited

Legend:

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

    r11313 r11315  
    9898    throws ConditionThrowable
    9999  {
    100     LispObject result = NIL;
    101100    final LispThread thread = LispThread.currentThread();
    102101    final SpecialBinding lastSpecialBinding = thread.lastSpecialBinding;
     
    348347    LispObject defs = checkList(args.car());
    349348    final LispThread thread = LispThread.currentThread();
    350     SpecialBinding lastSpecialBinding = thread.lastSpecialBinding;
    351     Environment ext = new Environment(env);
     349    final SpecialBinding lastSpecialBinding = thread.lastSpecialBinding;
     350    final Environment ext = new Environment(env);
    352351    while (defs != NIL)
    353352      {
     
    398397    try
    399398      {
    400         return progn(args.cdr(), ext, thread);
     399        final Environment innerEnv = new Environment(ext);
     400        LispObject body = args.cdr();
     401        while (body != NIL)
     402          {
     403            LispObject obj = body.car();
     404            if (obj instanceof Cons && ((Cons)obj).car == Symbol.DECLARE)
     405              {
     406                LispObject decls = ((Cons)obj).cdr;
     407                while (decls != NIL)
     408                  {
     409                    LispObject decl = decls.car();
     410                    if (decl instanceof Cons && ((Cons)decl).car == Symbol.SPECIAL)
     411                      {
     412                        LispObject vars = ((Cons)decl).cdr;
     413                        while (vars != NIL)
     414                          {
     415                            innerEnv.declareSpecial((Symbol)((Cons)vars).car);
     416                            vars = ((Cons)vars).cdr;
     417                          }
     418                      }
     419                    decls = ((Cons)decls).cdr;
     420                  }
     421                body = ((Cons)body).cdr;
     422              }
     423            else
     424              break;
     425          }
     426        return progn(body, ext, thread);
    401427      }
    402428    finally
Note: See TracChangeset for help on using the changeset viewer.