Changeset 4840


Ignore:
Timestamp:
11/19/03 16:49:21 (18 years ago)
Author:
piso
Message:

Added support for SPECIAL declarations.

File:
1 edited

Legend:

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

    r4025 r4840  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: dolist.java,v 1.1 2003-09-23 15:42:41 piso Exp $
     5 * $Id: dolist.java,v 1.2 2003-11-19 16:49:21 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    4141        Environment oldDynEnv = thread.getDynamicEnvironment();
    4242        int depth = thread.getStackDepth();
     43        // Process declarations.
     44        LispObject specials = NIL;
     45        while (bodyForm != NIL) {
     46            LispObject obj = bodyForm.car();
     47            if (obj instanceof Cons && obj.car() == Symbol.DECLARE) {
     48                LispObject decls = obj.cdr();
     49                while (decls != NIL) {
     50                    LispObject decl = decls.car();
     51                    if (decl instanceof Cons && decl.car() == Symbol.SPECIAL) {
     52                        LispObject vars = decl.cdr();
     53                        while (vars != NIL) {
     54                            specials = new Cons(vars.car(), specials);
     55                            vars = vars.cdr();
     56                        }
     57                    }
     58                    decls = decls.cdr();
     59                }
     60                bodyForm = bodyForm.cdr();
     61            } else
     62                break;
     63        }
    4364        try {
    4465            LispObject list = checkList(eval(listForm, env, thread));
     
    5677            while (list != NIL) {
    5778                Environment ext = new Environment(env);
    58                 bind(var, list.car(), ext);
     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());
    5986                LispObject body = bodyForm;
    6087                while (body != NIL) {
Note: See TracChangeset for help on using the changeset viewer.