Changeset 4539


Ignore:
Timestamp:
10/25/03 21:53:23 (18 years ago)
Author:
piso
Message:

SYMBOL-MACROLET

File:
1 edited

Legend:

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

    r4399 r4539  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: SpecialOperators.java,v 1.6 2003-10-15 21:27:24 piso Exp $
     5 * $Id: SpecialOperators.java,v 1.7 2003-10-25 21:53:23 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    114114        return result;
    115115    }
     116
     117    // ### symbol-macrolet
     118    private static final SpecialOperator SYMBOL_MACROLET =
     119        new SpecialOperator("symbol-macrolet")
     120    {
     121        public LispObject execute(LispObject args, Environment env)
     122            throws ConditionThrowable
     123        {
     124            boolean sequential = true; // FIXME Is this right?
     125            LispObject varList = checkList(args.car());
     126            final LispThread thread = LispThread.currentThread();
     127            LispObject result = NIL;
     128            if (varList != NIL) {
     129                Environment oldDynEnv = thread.getDynamicEnvironment();
     130                try {
     131                    Environment ext = new Environment(env);
     132                    Environment evalEnv = sequential ? ext : env;
     133                    for (int i = varList.length(); i-- > 0;) {
     134                        LispObject obj = varList.car();
     135                        varList = varList.cdr();
     136                        if (obj instanceof Cons && obj.length() == 2) {
     137                            bind(checkSymbol(obj.car()),
     138                                 new SymbolMacro(eval(obj.cadr(), evalEnv, thread)),
     139                                 ext);
     140                        } else
     141                            throw new ConditionThrowable(new ProgramError("SYMBOL-MACROLET: bad symbol-expansion pair: " + obj));
     142                    }
     143                    LispObject body = args.cdr();
     144                    while (body != NIL) {
     145                        result = eval(body.car(), ext, thread);
     146                        body = body.cdr();
     147                    }
     148                }
     149                finally {
     150                    thread.setDynamicEnvironment(oldDynEnv);
     151                }
     152            } else {
     153                LispObject body = args.cdr();
     154                while (body != NIL) {
     155                    result = eval(body.car(), env, thread);
     156                    body = body.cdr();
     157                }
     158            }
     159            return result;
     160        }
     161    };
    116162
    117163    // ### load-time-value
     
    221267    }
    222268
    223     // ### symbol-macrolet
    224     private static final SpecialOperator SYMBOL_MACROLET =
    225         new SpecialOperator("symbol-macrolet")
    226     {
    227         public LispObject execute(LispObject args, Environment env)
    228             throws ConditionThrowable
    229         {
    230             throw new ConditionThrowable(new LispError("SYMBOL-MACROLET is not implemented"));
    231         }
    232     };
    233 
    234269    // ### the
    235270    // the value-type form => result*
Note: See TracChangeset for help on using the changeset viewer.