Changeset 4553


Ignore:
Timestamp:
10/27/03 19:19:15 (18 years ago)
Author:
piso
Message:

MULTIPLE-VALUE-SETQ: symbol macro support.

File:
1 edited

Legend:

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

    r4549 r4553  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.486 2003-10-27 04:44:18 dmcnaught Exp $
     5 * $Id: Primitives.java,v 1.487 2003-10-27 19:19:15 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    32403240                LispObject value = i < limit ? values[i] : NIL;
    32413241                ++i;
     3242                Binding binding = null;
    32423243                if (symbol.isSpecialVariable()) {
    3243                     if (dynEnv != null) {
    3244                         Binding binding = dynEnv.getBinding(symbol);
    3245                         if (binding != null) {
    3246                             binding.value = value;
    3247                             vars = vars.cdr();
    3248                             continue;
    3249                         }
    3250                     }
    3251                     symbol.setSymbolValue(value);
    3252                     vars = vars.cdr();
    3253                     continue;
    3254                 }
    3255                 // Not special.
    3256                 Binding binding = env.getBinding(symbol);
    3257                 if (binding != null)
    3258                     binding.value = value;
    3259                 else
    3260                     symbol.setSymbolValue(value);
     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                }
    32613267                vars = vars.cdr();
    32623268            }
     
    44694475    };
    44704476
    4471     private static final Primitive1 COS = 
     4477    private static final Primitive1 COS =
    44724478        new Primitive1("cos") {
    44734479        public LispObject execute(LispObject arg) throws ConditionThrowable
     
    44764482        }
    44774483    };
    4478    
     4484
    44794485    private static LispObject cos(LispObject arg) throws ConditionThrowable
    44804486    {
     
    44904496            return c;
    44914497        }
    4492        
     4498
    44934499        throw new ConditionThrowable(new TypeError(arg, "number"));
    44944500    }
    4495    
     4501
    44964502    private static final Primitive1 SIN =
    44974503        new Primitive1("sin") {
     
    45014507        }
    45024508    };
    4503    
     4509
    45044510    private static LispObject sin(LispObject arg) throws ConditionThrowable
    45054511    {
     
    45184524        throw new ConditionThrowable(new TypeError(arg, "number"));
    45194525    }
    4520    
     4526
    45214527    private static final Primitive1 TAN =
    45224528        new Primitive1("tan") {
     
    45264532        }
    45274533    };
    4528    
     4534
    45294535    private static LispObject tan(LispObject arg) throws ConditionThrowable
    45304536    {
    45314537        return sin(arg).divideBy(cos(arg));
    45324538    }
    4533    
     4539
    45344540    private static final Primitive1 EXP =
    45354541        new Primitive1("exp") {
     
    45394545        }
    45404546    };
    4541    
     4547
    45424548    private static LispObject exp(LispObject arg) throws ConditionThrowable
    45434549    {
     
    45534559            return Complex.getInstance(resX, resY);
    45544560        }
    4555        
     4561
    45564562        throw new ConditionThrowable(new TypeError(arg, "number"));
    45574563    }
    4558    
     4564
    45594565    // ### sqrt
    45604566    private static final Primitive1 SQRT =
     
    45794585            }
    45804586        }
    4581            
     4587
    45824588        throw new ConditionThrowable(new TypeError(obj, "number"));
    45834589    }
Note: See TracChangeset for help on using the changeset viewer.