Changeset 4843


Ignore:
Timestamp:
11/19/03 17:33:04 (18 years ago)
Author:
piso
Message:

Reuse the binding.

File:
1 edited

Legend:

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

    r4841 r4843  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: dotimes.java,v 1.3 2003-11-19 17:04:09 piso Exp $
     5 * $Id: dotimes.java,v 1.4 2003-11-19 17:33:04 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    7575            }
    7676            LispObject result;
     77            // Establish a reusable binding.
     78            Environment ext = new Environment(env);
     79            final Binding binding;
     80            if (specials != NIL && memq(var, specials)) {
     81                thread.bindSpecial(var, null);
     82                binding = thread.getDynamicEnvironment().getBinding(var);
     83                ext.declareSpecial(var);
     84            } else if (var.isSpecialVariable()) {
     85                thread.bindSpecial(var, null);
     86                binding = thread.getDynamicEnvironment().getBinding(var);
     87            } else {
     88                ext.bind(var, null);
     89                binding = ext.getBinding(var);
     90            }
    7791            if (limit instanceof Fixnum) {
    7892                int count = ((Fixnum)limit).getValue();
    7993                int i;
    8094                for (i = 0; i < count; i++) {
    81                     Environment ext = new Environment(env);
    82                     if (specials != NIL && memq(var, specials)) {
    83                         thread.bindSpecial(var, new Fixnum(i));
    84                         ext.declareSpecial(var);
    85                     } else if (var.isSpecialVariable()) {
    86                         thread.bindSpecial(var, new Fixnum(i));
    87                     } else
    88                         ext.bind(var, new Fixnum(i));
     95                    binding.value = new Fixnum(i);
    8996                    LispObject body = bodyForm;
    9097                    while (body != NIL) {
     
    96103                                    LispObject code = null;
    97104                                    LispObject tag = current.cadr();
    98                                     for (Binding binding = tags; binding != null; binding = binding.next) {
    99                                         if (binding.symbol.eql(tag)) {
    100                                             code = binding.value;
     105                                    for (Binding b = tags; b != null; b = b.next) {
     106                                        if (b.symbol.eql(tag)) {
     107                                            code = b.value;
    101108                                            break;
    102109                                        }
     
    113120                                LispObject code = null;
    114121                                LispObject tag = go.getTag();
    115                                 for (Binding binding = tags; binding != null; binding = binding.next) {
    116                                     if (binding.symbol.eql(tag)) {
    117                                         code = binding.value;
     122                                for (Binding b = tags; b != null; b = b.next) {
     123                                    if (b.symbol.eql(tag)) {
     124                                        code = b.value;
    118125                                        break;
    119126                                    }
     
    130137                    }
    131138                }
    132                 Environment ext = new Environment(env);
    133                 bind(var, new Fixnum(i), ext);
     139                binding.value = new Fixnum(i);
    134140                result = eval(resultForm, ext, thread);
    135141            } else if (limit instanceof Bignum) {
    136142                LispObject i = Fixnum.ZERO;
    137143                while (i.isLessThan(limit)) {
    138                     Environment ext = new Environment(env);
    139                     bind(var, i, ext);
     144                    binding.value = i;
    140145                    LispObject body = bodyForm;
    141146                    while (body != NIL) {
     
    147152                                    LispObject code = null;
    148153                                    LispObject tag = current.cadr();
    149                                     for (Binding binding = tags; binding != null; binding = binding.next) {
    150                                         if (binding.symbol.eql(tag)) {
    151                                             code = binding.value;
     154                                    for (Binding b = tags; b != null; b = b.next) {
     155                                        if (b.symbol.eql(tag)) {
     156                                            code = b.value;
    152157                                            break;
    153158                                        }
     
    164169                                LispObject code = null;
    165170                                LispObject tag = go.getTag();
    166                                 for (Binding binding = tags; binding != null; binding = binding.next) {
    167                                     if (binding.symbol.eql(tag)) {
    168                                         code = binding.value;
     171                                for (Binding b = tags; b != null; b = b.next) {
     172                                    if (b.symbol.eql(tag)) {
     173                                        code = b.value;
    169174                                        break;
    170175                                    }
     
    182187                    i = i.incr();
    183188                }
    184                 Environment ext = new Environment(env);
    185                 bind(var, i, ext);
     189                binding.value = i;
    186190                result = eval(resultForm, ext, thread);
    187191            } else
Note: See TracChangeset for help on using the changeset viewer.