Changeset 4842


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

Reuse the binding.

File:
1 edited

Legend:

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

    r4840 r4842  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: dolist.java,v 1.2 2003-11-19 16:49:21 piso Exp $
     5 * $Id: dolist.java,v 1.3 2003-11-19 17:27:20 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    7575                tags = new Binding(current, remaining, tags);
    7676            }
     77            // Establish a reusable binding.
     78            final Environment ext = new Environment(env);
     79            final Binding binding;
     80            if (var.isSpecialVariable() || (specials != NIL && memq(var, specials))) {
     81                thread.bindSpecial(var, null);
     82                binding = thread.getDynamicEnvironment().getBinding(var);
     83                ext.declareSpecial(var);
     84            } else {
     85                ext.bind(var, null);
     86                binding = ext.getBinding(var);
     87            }
    7788            while (list != NIL) {
    78                 Environment ext = new Environment(env);
    79                 if (specials != NIL && memq(var, specials)) {
    80                     thread.bindSpecial(var, list.car());
    81                     ext.declareSpecial(var);
    82                 } else if (var.isSpecialVariable()) {
    83                     thread.bindSpecial(var, list.car());
    84                 } else
    85                     ext.bind(var, list.car());
     89                binding.value = list.car();
    8690                LispObject body = bodyForm;
    8791                while (body != NIL) {
     
    9397                                LispObject code = null;
    9498                                LispObject tag = current.cadr();
    95                                 for (Binding binding = tags; binding != null; binding = binding.next) {
    96                                     if (binding.symbol.eql(tag)) {
    97                                         code = binding.value;
     99                                for (Binding b = tags; b != null; b = b.next) {
     100                                    if (b.symbol.eql(tag)) {
     101                                        code = b.value;
    98102                                        break;
    99103                                    }
     
    110114                            LispObject code = null;
    111115                            LispObject tag = go.getTag();
    112                             for (Binding binding = tags; binding != null; binding = binding.next) {
    113                                 if (binding.symbol.eql(tag)) {
    114                                     code = binding.value;
     116                            for (Binding b = tags; b != null; b = b.next) {
     117                                if (b.symbol.eql(tag)) {
     118                                    code = b.value;
    115119                                    break;
    116120                                }
     
    128132                list = list.cdr();
    129133            }
    130             Environment ext = new Environment(env);
    131             bind(var, NIL, ext);
     134            binding.value = NIL;
    132135            LispObject result = eval(resultForm, ext, thread);
    133136            return result;
Note: See TracChangeset for help on using the changeset viewer.