Changeset 4841


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

Added support for SPECIAL declarations.

File:
1 edited

Legend:

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

    r4024 r4841  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: dotimes.java,v 1.2 2003-09-23 15:42:18 piso Exp $
     5 * $Id: dotimes.java,v 1.3 2003-11-19 17:04:09 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    4040        Environment oldDynEnv = thread.getDynamicEnvironment();
    4141        int depth = thread.getStackDepth();
     42        // Process declarations.
     43        LispObject specials = NIL;
     44        while (bodyForm != NIL) {
     45            LispObject obj = bodyForm.car();
     46            if (obj instanceof Cons && obj.car() == Symbol.DECLARE) {
     47                LispObject decls = obj.cdr();
     48                while (decls != NIL) {
     49                    LispObject decl = decls.car();
     50                    if (decl instanceof Cons && decl.car() == Symbol.SPECIAL) {
     51                        LispObject vars = decl.cdr();
     52                        while (vars != NIL) {
     53                            specials = new Cons(vars.car(), specials);
     54                            vars = vars.cdr();
     55                        }
     56                    }
     57                    decls = decls.cdr();
     58                }
     59                bodyForm = bodyForm.cdr();
     60            } else
     61                break;
     62        }
    4263        try {
    4364            LispObject limit = eval(countForm, env, thread);
     
    5980                for (i = 0; i < count; i++) {
    6081                    Environment ext = new Environment(env);
    61                     bind(var, new Fixnum(i), ext);
     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));
    6289                    LispObject body = bodyForm;
    6390                    while (body != NIL) {
Note: See TracChangeset for help on using the changeset viewer.