Changeset 13824


Ignore:
Timestamp:
01/29/12 21:41:47 (9 years ago)
Author:
ehuelsmann
Message:

Use the arglist parser in some places.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/Closure.java

    r13823 r13824  
    460460    final LispThread thread = LispThread.currentThread();
    461461    final SpecialBindingsMark mark = thread.markSpecialBindings();
     462
    462463    Environment ext = new Environment(environment);
    463     bindRequiredParameters(ext, thread, objects);
    464     if (arity != minArgs)
    465       {
    466         bindParameterDefaults(optionalParameters, ext, thread);
    467         if (restVar != null)
    468           bindArg(specials, restVar, NIL, ext, thread);
    469         bindParameterDefaults(keywordParameters, ext, thread);
    470       }
    471     bindAuxVars(ext, thread);
     464    LispObject[] args = arglist.match(objects, environment, ext, thread);
     465    arglist.bindVars(args, ext, thread);
    472466    declareFreeSpecials(ext);
    473467    try
     
    478472      {
    479473        thread.resetSpecialBindings(mark);
    480       }
    481   }
    482 
    483   private final void bindRequiredParameters(Environment ext,
    484                                             LispThread thread,
    485                                             LispObject[] objects)
    486 
    487   {
    488     // &whole and &environment before anything
    489     if (envVar != null)
    490       bindArg(specials, envVar, environment, ext, thread);
    491     for (int i = 0; i < objects.length; ++i)
    492       {
    493         bindArg(specials, requiredParameters[i].var, objects[i], ext, thread);
    494474      }
    495475  }
     
    655635    final SpecialBindingsMark mark = thread.markSpecialBindings();
    656636    Environment ext = new Environment(environment);
    657     if (optionalParameters.length == 0 && keywordParameters.length == 0)
    658       args = fastProcessArgs(args);
    659     else
    660       args = processArgs(args, thread);
    661     Debug.assertTrue(args.length == variables.length);
    662     if (envVar != null)
    663       {
    664         bindArg(specials, envVar, environment, ext, thread);
    665       }
    666     for (int i = 0; i < variables.length; i++)
    667       {
    668         Symbol sym = variables[i];
    669         bindArg(specials, sym, args[i], ext, thread);
    670       }
    671     bindAuxVars(ext, thread);
     637    args = arglist.match(args, environment, ext, thread);
     638    arglist.bindVars(args, ext, thread);
    672639    declareFreeSpecials(ext);
    673640    try
     
    1030997  }
    1031998
    1032   private final void bindParameterDefaults(Parameter[] parameters,
    1033                                            Environment env,
    1034                                            LispThread thread)
    1035 
    1036   {
    1037     for (Parameter parameter : parameters)
    1038       {
    1039         LispObject value;
    1040         if (parameter.initVal != null)
    1041           value = parameter.initVal;
    1042         else
    1043           value = eval(parameter.initForm, env, thread);
    1044         bindArg(specials, parameter.var, value, env, thread);
    1045         if (parameter.svar != NIL)
    1046     bindArg(specials, (Symbol)parameter.svar, NIL, env, thread);
    1047       }
    1048   }
    1049 
    1050   private final void bindAuxVars(Environment env, LispThread thread)
    1051 
    1052   {
    1053     // Aux variable processing is analogous to LET* processing.
    1054     for (Parameter parameter : auxVars)
    1055       {
    1056         Symbol sym = parameter.var;
    1057         LispObject value;
    1058 
    1059         if (parameter.initVal != null)
    1060           value = parameter.initVal;
    1061         else
    1062           value = eval(parameter.initForm, env, thread);
    1063 
    1064         bindArg(specials, sym, value, env, thread);
    1065       }
    1066   }
    1067 
    1068999  public static class Parameter
    10691000  {
Note: See TracChangeset for help on using the changeset viewer.