Changeset 5252


Ignore:
Timestamp:
12/25/03 17:19:07 (18 years ago)
Author:
piso
Message:

processDeclarations()

File:
1 edited

Legend:

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

    r5111 r5252  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Closure.java,v 1.61 2003-12-12 19:41:42 piso Exp $
     5 * $Id: Closure.java,v 1.62 2003-12-25 17:19:07 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    5656
    5757    private final Symbol[] variables;
     58    private final Symbol[] specials;
    5859
    5960    public Closure(LispObject lambdaList, LispObject body, Environment env)
     
    234235            Debug.assertTrue(arity == minArgs);
    235236        variables = processVariables();
     237        specials = processDeclarations();
    236238    }
    237239
     
    262264        Symbol[] array = new Symbol[vars.size()];
    263265        vars.toArray(array);
     266        return array;
     267    }
     268
     269    private final Symbol[] processDeclarations() throws ConditionThrowable
     270    {
     271        ArrayList specials = null;
     272        LispObject forms = body;
     273        while (forms != NIL) {
     274            LispObject obj = forms.car();
     275            if (obj instanceof Cons && obj.car() == Symbol.DECLARE) {
     276                LispObject decls = obj.cdr();
     277                while (decls != NIL) {
     278                    LispObject decl = decls.car();
     279                    if (decl instanceof Cons && decl.car() == Symbol.SPECIAL) {
     280                        LispObject vars = decl.cdr();
     281                        while (vars != NIL) {
     282                            Symbol var = checkSymbol(vars.car());
     283                            if (specials == null)
     284                                specials = new ArrayList();
     285                            specials.add(var);
     286                            vars = vars.cdr();
     287                        }
     288                    }
     289                    decls = decls.cdr();
     290                }
     291                forms = forms.cdr();
     292            } else
     293                break;
     294        }
     295        if (specials == null)
     296            return null;
     297        Symbol[] array = new Symbol[specials.size()];
     298        specials.toArray(array);
    264299        return array;
    265300    }
     
    326361            Environment oldDynEnv = thread.getDynamicEnvironment();
    327362            Environment ext = new Environment(environment);
     363            if (specials != null) {
     364                for (int i = 0; i < specials.length; i++)
     365                    ext.declareSpecial(specials[i]);
     366            }
    328367            bind(requiredParameters[0].var, arg, ext);
    329368            if (arity != 1) {
     
    359398            Environment oldDynEnv = thread.getDynamicEnvironment();
    360399            Environment ext = new Environment(environment);
     400            if (specials != null) {
     401                for (int i = 0; i < specials.length; i++)
     402                    ext.declareSpecial(specials[i]);
     403            }
    361404            bind(requiredParameters[0].var, first, ext);
    362405            bind(requiredParameters[1].var, second, ext);
     
    395438            Environment oldDynEnv = thread.getDynamicEnvironment();
    396439            Environment ext = new Environment(environment);
     440            if (specials != null) {
     441                for (int i = 0; i < specials.length; i++)
     442                    ext.declareSpecial(specials[i]);
     443            }
    397444            bind(requiredParameters[0].var, first, ext);
    398445            bind(requiredParameters[1].var, second, ext);
     
    439486        Environment oldDynEnv = thread.getDynamicEnvironment();
    440487        Environment ext = new Environment(environment);
     488        if (specials != null) {
     489            for (int i = 0; i < specials.length; i++)
     490                ext.declareSpecial(specials[i]);
     491        }
    441492        args = processArgs(args);
    442493        Debug.assertTrue(args.length == variables.length);
Note: See TracChangeset for help on using the changeset viewer.