Changeset 4830


Ignore:
Timestamp:
11/19/03 02:34:32 (18 years ago)
Author:
piso
Message:

SYMBOL-VALUE, SET

File:
1 edited

Legend:

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

    r4809 r4830  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.501 2003-11-17 16:13:55 piso Exp $
     5 * $Id: Primitives.java,v 1.502 2003-11-19 02:34:32 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    8282    private static final int RPLACA                     = 46;
    8383    private static final int RPLACD                     = 47;
    84     private static final int SET                        = 48;
    8584
    8685    private Primitives()
     
    135134        definePrimitive2("rplaca", RPLACA);
    136135        definePrimitive2("rplacd", RPLACD);
    137         definePrimitive2("set", SET);
    138136    }
    139137
     
    330328                first.setCdr(second);
    331329                return first;
    332             case SET:                           // ### set
    333                 checkSymbol(first).setSymbolValue(second);
    334                 return second;
    335330            default:
    336331                Debug.trace("bad index " + index);
     
    531526        public LispObject execute(LispObject arg) throws ConditionThrowable
    532527        {
    533             if (arg == T)
    534                 return T;
    535             if (arg == NIL)
    536                 return NIL;
    537             LispObject value = checkSymbol(arg).symbolValue();
    538             if (value instanceof SymbolMacro)
    539                 throw new ConditionThrowable(new LispError(arg + " has no dynamic value"));
     528            final Symbol symbol = checkSymbol(arg);
     529            LispObject value =
     530                LispThread.currentThread().lookupSpecial(symbol);
     531            if (value == null) {
     532                value = symbol.symbolValue();
     533                if (value instanceof SymbolMacro)
     534                    throw new ConditionThrowable(new LispError(arg + " has no dynamic value"));
     535            }
    540536            return value;
     537        }
     538    };
     539
     540    // ### set
     541    // set symbol value => value
     542    private static final Primitive2 SET = new Primitive2("set")
     543    {
     544        public LispObject execute(LispObject first, LispObject second)
     545            throws ConditionThrowable
     546        {
     547            Symbol symbol = checkSymbol(first);
     548            Environment dynEnv =
     549                LispThread.currentThread().getDynamicEnvironment();
     550            if (dynEnv != null) {
     551                Binding binding = dynEnv.getBinding(symbol);
     552                if (binding != null) {
     553                    binding.value = second;
     554                    return second;
     555                }
     556            }
     557            symbol.setSymbolValue(second);
     558            return second;
    541559        }
    542560    };
Note: See TracChangeset for help on using the changeset viewer.