Changeset 4557


Ignore:
Timestamp:
10/28/03 02:41:16 (19 years ago)
Author:
piso
Message:

MULTIPLE-VALUE-SETQ is now implemented in boot.lisp.

File:
1 edited

Legend:

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

    r4553 r4557  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.487 2003-10-27 19:19:15 piso Exp $
     5 * $Id: Primitives.java,v 1.488 2003-10-28 02:41:16 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    32113211    };
    32123212
    3213     // ### multiple-value-setq
    3214     // multiple-value-setq vars form => result
    3215     // Result is the primary value returned by the form.
    3216     // Should be a macro.
    3217     private static final SpecialOperator MULTIPLE_VALUE_SETQ =
    3218         new SpecialOperator("multiple-value-setq")
    3219     {
    3220         public LispObject execute(LispObject args, Environment env)
    3221             throws ConditionThrowable
    3222         {
    3223             if (args.length() != 2)
    3224                 throw new ConditionThrowable(new WrongNumberOfArgumentsException(this));
    3225             LispObject vars = args.car();
    3226             LispObject form = args.cadr();
    3227             final LispThread thread = LispThread.currentThread();
    3228             LispObject result = eval(form, env, thread);
    3229             LispObject[] values = thread.getValues();
    3230             if (values == null) {
    3231                 // eval() did not return multiple values.
    3232                 values = new LispObject[1];
    3233                 values[0] = result;
    3234             }
    3235             final Environment dynEnv = thread.getDynamicEnvironment();
    3236             final int limit = values.length;
    3237             int i = 0;
    3238             while (vars != NIL) {
    3239                 Symbol symbol = checkSymbol(vars.car());
    3240                 LispObject value = i < limit ? values[i] : NIL;
    3241                 ++i;
    3242                 Binding binding = null;
    3243                 if (symbol.isSpecialVariable()) {
    3244                     if (dynEnv != null)
    3245                         binding = dynEnv.getBinding(symbol);
    3246                 } else {
    3247                     // Not special.
    3248                     binding = env.getBinding(symbol);
    3249                 }
    3250                 if (binding != null) {
    3251                     if (binding.value instanceof SymbolMacro) {
    3252                         LispObject expansion =
    3253                             ((SymbolMacro)binding.value).getExpansion();
    3254                         LispObject obj = list3(Symbol.SETF, expansion, value);
    3255                         eval(obj, env, thread);
    3256                     } else
    3257                         binding.value = value;
    3258                 } else {
    3259                     if (symbol.getSymbolValue() instanceof SymbolMacro) {
    3260                         LispObject expansion =
    3261                             ((SymbolMacro)symbol.getSymbolValue()).getExpansion();
    3262                         LispObject obj = list3(Symbol.SETF, expansion, value);
    3263                         eval(obj, env, thread);
    3264                     } else
    3265                         symbol.setSymbolValue(value);
    3266                 }
    3267                 vars = vars.cdr();
    3268             }
    3269             thread.clearValues();
    3270             return result;
    3271         }
    3272     };
    3273 
    32743213    // ### multiple-value-prog1
    32753214    private static final SpecialOperator MULTIPLE_VALUE_PROG1 =
Note: See TracChangeset for help on using the changeset viewer.