Changeset 4837


Ignore:
Timestamp:
11/19/03 14:59:58 (18 years ago)
Author:
piso
Message:

_let(): cleaned up support for SPECIAL declarations.

File:
1 edited

Legend:

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

    r4834 r4837  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: SpecialOperators.java,v 1.16 2003-11-19 13:51:21 piso Exp $
     5 * $Id: SpecialOperators.java,v 1.17 2003-11-19 14:59:58 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    8989            LispObject body = args.cdr();
    9090            Environment ext = new Environment(env);
    91             // FIXME An ArrayList is probably not the most efficient data
    92             // structure for this.
    93             ArrayList specials = null;
     91            LispObject specials = NIL;
     92            // Process declarations.
    9493            while (body != NIL) {
    9594                LispObject obj = body.car();
     
    101100                            LispObject vars = decl.cdr();
    102101                            while (vars != NIL) {
    103                                 Symbol var = checkSymbol(vars.car());
    104                                 if (specials == null)
    105                                     specials = new ArrayList();
    106                                 specials.add(var);
     102                                specials = new Cons(vars.car(), specials);
    107103                                vars = vars.cdr();
    108104                            }
     
    116112            Environment evalEnv = sequential ? ext : env;
    117113            while (varList != NIL) {
     114                Symbol symbol;
     115                LispObject value;
    118116                LispObject obj = varList.car();
     117                if (obj instanceof Cons) {
     118                    symbol = checkSymbol(obj.car());
     119                    value = eval(obj.cadr(), evalEnv, thread);
     120                } else {
     121                    symbol = checkSymbol(obj);
     122                    value = NIL;
     123                }
     124                if (specials != NIL && memq(symbol, specials)) {
     125                    thread.bindSpecial(symbol, value);
     126                    ext.declareSpecial(symbol);
     127                } else if (symbol.isSpecialVariable()) {
     128                    thread.bindSpecial(symbol, value);
     129                } else
     130                    ext.bind(symbol, value);
    119131                varList = varList.cdr();
    120                 if (obj instanceof Cons) {
    121                     Symbol symbol = checkSymbol(obj.car());
    122                     LispObject value = eval(obj.cadr(), evalEnv, thread);
    123                     if (specials != null && specials.contains(symbol)) {
    124                         thread.bindSpecial(symbol, value);
    125                         ext.declareSpecial(symbol);
    126                     }  else if (symbol.isSpecialVariable())
    127                         thread.bindSpecial(symbol, value);
    128                     else
    129                         ext.bind(symbol, value);
    130                 } else {
    131                     Symbol symbol = checkSymbol(obj);
    132                     if (specials != null && specials.contains(symbol)) {
    133                         thread.bindSpecial(symbol, NIL);
    134                         ext.declareSpecial(symbol);
    135                     } else if (symbol.isSpecialVariable())
    136                         thread.bindSpecial(symbol, NIL);
    137                     else
    138                         ext.bind(symbol, NIL);
    139                 }
    140132            }
    141133            while (body != NIL) {
Note: See TracChangeset for help on using the changeset viewer.